Zašto je moj NVMe sporiji od SSD-a?

Zašto je moj NVMe sporiji od SSD-a?
U ovom ćemo članku pogledati neke od nijansi I/O podsustava i njihov utjecaj na performanse.

Prije nekoliko tjedana naišao sam na pitanje zašto je NVMe na jednom poslužitelju sporiji od SATA na drugom. Pogledao sam karakteristike poslužitelja i shvatio da je to trik pitanje: NVMe je iz korisničkog segmenta, a SSD je iz segmenta poslužitelja.

Očito nije ispravno uspoređivati ​​proizvode iz različitih segmenata u različitim okruženjima, ali to nije iscrpan tehnički odgovor. Proučit ćemo osnove, provesti pokuse i dati odgovor na postavljeno pitanje.

Što je fsync i gdje se koristi

Kako bi se ubrzao rad s pogonima, podaci se spremaju u međuspremnik, odnosno pohranjuju u nestabilnu memoriju sve dok se ne ukaže zgodna prilika za spremanje sadržaja međuspremnika na pogon. Kriteriji mogućnosti određeni su operativnim sustavom i karakteristikama pogona. U slučaju nestanka struje, svi podaci u međuspremniku bit će izgubljeni.

Postoji niz zadataka u kojima morate biti sigurni da su promjene u datoteci zapisane na pogon i da ne leže u međuspremniku. Ovo osiguranje se može dobiti korištenjem POSIX-kompatibilnog fsync sistemskog poziva. Poziv fsync prisiljava pisanje iz međuspremnika na pogon.

Demonstrirajmo učinak međuspremnika umjetnim primjerom u obliku kratkog C programa.

#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(void) {
    /* Открываем файл answer.txt на запись, если его нет -- создаём */
    int fd = open("answer.txt", O_WRONLY | O_CREAT);
    /* Записываем первый набор данных */
    write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
    /* Делаем вид, что проводим вычисления в течение 10 секунд */
    sleep(10);
    /* Записываем результат вычислений */
    write(fd, "42n", 3); 

    return 0;
}

Komentari dobro objašnjavaju slijed radnji u programu. Tekst "odgovor na glavno pitanje života, svemira i svega toga" će biti pohranjen u međuspremnik od strane operativnog sustava, a ako ponovno pokrenete server pritiskom na tipku Reset tijekom "izračunavanja", datoteka će biti prazna. U našem primjeru gubitak teksta nije problem, pa fsync nije potreban. Baze podataka ne dijele ovaj optimizam.

Baze podataka su složeni programi koji rade s mnogo datoteka u isto vrijeme, pa žele biti sigurni da će podaci koje pišu biti pohranjeni na disku, jer o tome ovisi konzistentnost podataka unutar baze podataka. Baze podataka su dizajnirane tako da bilježe sve izvršene transakcije i da u svakom trenutku budu spremne za nestanak struje. Ovo vas ponašanje obvezuje da stalno koristite fsync u velikim količinama.

Što utječe na čestu upotrebu fsync

S normalnim I/O operativni sustav pokušava optimizirati diskovnu komunikaciju budući da su vanjski diskovi najsporiji u hijerarhiji memorije. Stoga operativni sustav pokušava upisati što je više moguće podataka u jednom pristupu pogonu.

Pokažimo utjecaj upotrebe fsync-a na konkretnom primjeru. Kao subjekte testiranja imamo sljedeće SSD-ove:

  • Intel® DC SSD S4500 480 GB, povezan preko SATA 3.2, 6 Gb/s;
  • Samsung 970 EVO Plus 500GB, povezan putem PCIe 3.0 x4, ~31 Gbps.

Testovi se provode na Intel® Xeon® W-2255 koji pokreće Ubuntu 20.04. Za testiranje diskova koristi se sysbench 1.0.18. Diskovi imaju jednu particiju formatiranu kao ext4. Priprema za test je stvaranje datoteka od 100 GB:

sysbench --test=fileio --file-total-size=100G prepare

Izvođenje testova:

# Без fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run

# С fsync после каждой записи
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 run

Rezultati ispitivanja prikazani su u tablici.

Test
Intel® S4500
Samsung 970 EVO+

Čitaj bez fsync-a, MiB/s
5734.89
9028.86

Pišite bez fsync-a, MiB/s
3823.26
6019.24

Čitanje s fsync, MiB/s
37.76
3.27

Snimanje s fsync, MiB/s
25.17
2.18

Lako je vidjeti da NVMe iz klijentskog segmenta pouzdano vodi kada operativni sustav sam odlučuje kako će raditi s diskovima, a gubi kada se koristi fsync. Ovo postavlja dva pitanja:

  1. Zašto brzina čitanja premašuje fizičku propusnost veze u testu bez fsync-a?
  2. Zašto je SSD segmenta poslužitelja bolji u rukovanju velikim brojem fsync zahtjeva?

Odgovor na prvo pitanje je jednostavan: sysbench generira datoteke ispunjene nulama. Dakle, test je proveden na 100 gigabajta nula. Budući da su podaci vrlo ujednačeni i predvidljivi, u igru ​​dolaze razne optimizacije OS-a koje značajno ubrzavaju izvođenje.

Ako dovodite u pitanje sve rezultate sysbench-a, onda možete koristiti fio.

# Без fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb

# С fsync после каждой записи
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdb

Test
Intel® S4500
Samsung 970 EVO+

Čitaj bez fsync-a, MiB/s
45.5
178

Pišite bez fsync-a, MiB/s
30.4
119

Čitanje s fsync, MiB/s
32.6
20.9

Snimanje s fsync, MiB/s
21.7
13.9

Jasno je vidljiv trend pada performansi u NVMe-u kada se koristi fsync. Možete prijeći na drugo pitanje.

Optimizacija ili blef

Ranije smo rekli da se podaci pohranjuju u međuspremnik, ali nismo precizirali u koji jer to nije bilo važno. Čak i sada nećemo ulaziti u zamršenost operativnih sustava i izdvojiti dvije općenite vrste međuspremnika:

  • program;
  • hardver.

Softverski međuspremnik odnosi se na međuspremnike koji se nalaze u operativnom sustavu, a hardverski međuspremnik odnosi se na hlapljivu memoriju kontrolera diska. Sistemski poziv fsync šalje naredbu pogonu za pisanje podataka iz svog međuspremnika u glavnu pohranu, ali nema načina za kontrolu ispravnog izvršenja naredbe.

Budući da SSD radi bolje, mogu se napraviti dvije pretpostavke:

  • disk je dizajniran za opterećenje sličnog plana;
  • disk "blefira" i ignorira naredbu.

Nepošteno ponašanje pogona može se primijetiti ako provedete test s nestankom struje. To možete provjeriti pomoću skripte. diskchecker.pl, to je bilo uspostavljena u 2005 godine.

Ova skripta zahtijeva dva fizička stroja - "poslužitelj" i "klijent". Klijent zapisuje malu količinu podataka na pogon koji se testira, poziva fsync i šalje poslužitelju informacije o tome što je napisano.

# Запускается на сервере
./diskchecker.pl -l [port]

# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>

Nakon pokretanja skripte, potrebno je isključiti "klijenta" i ne vraćati napajanje nekoliko minuta. Važno je ispitanika isključiti iz struje, a ne samo izvršiti tvrdo gašenje. Nakon nekog vremena poslužitelj se može spojiti i učitati u OS. Nakon pokretanja OS-a, morate pokrenuti ispočetka diskchecker.pl, ali s argumentom provjeriti.

./diskchecker.pl -s <server[:port]> verify <file>

Na kraju provjere vidjet ćete broj grešaka. Ako su 0, tada je disk prošao test. Kako bi se isključio splet okolnosti koji je uspješan za disk, eksperiment se može ponoviti nekoliko puta.

Naš S4500 nije pokazao greške zbog gubitka napajanja, što znači da je spreman za opterećenja s puno fsync poziva.

Zaključak

Prilikom odabira diskova ili cijelih gotovih konfiguracija treba imati na umu specifičnosti zadataka koje je potrebno riješiti. Na prvi pogled se čini očitim da je NVMe, odnosno SSD s PCIe sučeljem, brži od “klasičnog” SATA SSD-a. Međutim, kao što smo danas shvatili, u specifičnim uvjetima i određenim zadaćama to ne mora biti slučaj.

Kako testirate komponente poslužitelja kada unajmljujete od IaaS pružatelja usluga?
Čekamo vas u komentarima.

Zašto je moj NVMe sporiji od SSD-a?

Izvor: www.habr.com

Dodajte komentar