Zakaj je moj NVMe počasnejši kot moj SSD?

Zakaj je moj NVMe počasnejši kot moj SSD?
V tem članku si bomo ogledali nekatere nianse V/I podsistema in njihov vpliv na zmogljivost.

Pred nekaj tedni sem se soočil z vprašanjem, zakaj je NVMe na enem strežniku počasnejši od SATA na drugem. Pogledal sem specifikacije strežnika in ugotovil, da je to zapleteno vprašanje: NVMe je bil iz uporabniškega segmenta, SSD pa iz strežniškega segmenta.

Očitno ni pošteno primerjati izdelkov iz različnih segmentov v različnih okoljih, vendar to ni popoln tehnični odgovor. Preučimo osnove, izvedemo poskuse in odgovorimo na zastavljeno vprašanje.

Kaj je fsync in kje se uporablja?

Za pospešitev dela s pogoni se podatki shranijo v medpomnilnik, to je v hlapnem pomnilniku, dokler se ne prikaže primerna priložnost za shranjevanje vsebine medpomnilnika na pogon. Merila za "priložnost" določajo operacijski sistem in značilnosti pogona. V primeru izpada električne energije bodo vsi podatki v medpomnilniku izgubljeni.

Obstaja več opravil, pri katerih morate biti prepričani, da so spremembe datoteke zapisane na pogon in ne v vmesni medpomnilnik. To zagotovilo je mogoče pridobiti z uporabo sistemskega klica fsync, združljivega s POSIX. Klic funkcije fsync prisili pisanje iz medpomnilnika na pogon.

Pokažimo učinek medpomnilnikov z umetnim primerom v obliki kratkega programa v C.

#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;
}

Komentarji dobro pojasnjujejo zaporedje dejanj v programu. Besedilo "odgovor na glavno vprašanje življenja, vesolja in vsega tega" bo operacijski sistem shranil v medpomnilnik in če med "izračuni" znova zaženete strežnik s pritiskom na gumb Reset, bo datoteka prazna. V našem primeru izguba besedila ni težava, zato fsync ni potreben. Baze podatkov ne delijo tega optimizma.

Baze podatkov so zapleteni programi, ki hkrati delajo z veliko datotekami, zato želijo biti prepričani, da bodo podatki, ki jih zapišejo, shranjeni na disku, saj je od tega odvisna konsistentnost podatkov znotraj baze. Podatkovne baze so zasnovane tako, da beležijo vse opravljene transakcije in so kadar koli pripravljene na izgubo moči. To vedenje zahteva stalno uporabo fsync v velikih količinah.

Kakšen je učinek pogoste uporabe fsync?

Med običajnim V/I poskuša operacijski sistem optimizirati komunikacijo z diski, saj so zunanji pogoni najpočasnejši v pomnilniški hierarhiji. Zato operacijski sistem poskuša zapisati čim več podatkov v enem dostopu do diska.

Pokažimo vpliv uporabe fsync s posebnim primerom. Za testne pogone imamo naslednje SSD diske:

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

Testi se izvajajo na Intel® Xeon® W-2255 z operacijskim sistemom Ubuntu 20.04. Sysbench 1.0.18 se uporablja za testiranje diskov. Na diskih je bila ustvarjena ena particija, formatirana kot ext4. Priprava na test vključuje ustvarjanje 100 GB datotek:

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

Tekoči testi:

# Без 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 testa so predstavljeni v tabeli.

Preizkusna
Intel® S4500
Samsung 970 EVO+

Branje brez fsync, MiB/s
5734.89
9028.86

Snemanje brez fsync, MiB/s
3823.26
6019.24

Branje s fsync, MiB/s
37.76
3.27

Snemanje s fsync, MiB/s
25.17
2.18

Preprosto je videti, da NVMe iz odjemalskega segmenta zanesljivo vodi, ko se operacijski sistem sam odloči, kako bo deloval z diski, in izgubi, ko se uporablja fsync. To postavlja dve vprašanji:

  1. Zakaj hitrost branja v testu brez fsync presega fizično pasovno širino kanala?
  2. Zakaj je SSD segmenta strežnika boljši pri obravnavanju velikega števila zahtev fsync?

Odgovor na prvo vprašanje je preprost: sysbench ustvari datoteke, napolnjene z ničlami. Tako je bil test izveden na 100 gigabajtih ničel. Ker so podatki zelo enotni in predvidljivi, pridejo v poštev različne optimizacije operacijskega sistema, ki znatno pospešijo izvajanje.

Če dvomite o vseh rezultatih sysbench, lahko uporabite 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

Preizkusna
Intel® S4500
Samsung 970 EVO+

Branje brez fsync, MiB/s
45.5
178

Snemanje brez fsync, MiB/s
30.4
119

Branje s fsync, MiB/s
32.6
20.9

Snemanje s fsync, MiB/s
21.7
13.9

Nagnjenost k poslabšanju zmogljivosti NVMe pri uporabi fsync je jasno vidna. Lahko nadaljujete z odgovorom na drugo vprašanje.

Optimizacija ali blef

Prej smo rekli, da so podatki shranjeni v medpomnilniku, nismo pa navedli v katerem, saj to ni bilo pomembno. Tudi zdaj se ne bomo poglabljali v zapletenost operacijskih sistemov in bomo izpostavili dve splošni vrsti medpomnilnikov:

  • program;
  • strojne opreme.

Medpomnilnik programske opreme se nanaša na medpomnilnike, ki obstajajo v operacijskem sistemu, medpomnilnik strojne opreme pa se nanaša na hlapni pomnilnik krmilnika diska. Sistemski klic fsync pošlje ukaz pogonu, da zapiše podatke iz svojega medpomnilnika v glavni pomnilnik, vendar nima možnosti za preverjanje, ali je ukaz pravilno izveden.

Ker SSD kaže najboljše rezultate, lahko naredimo dve predpostavki:

  • disk je zasnovan za podobno obremenitev;
  • disk "blefira" in ignorira ukaz.

Nepošteno vedenje pogona lahko opazite, če opravite test izgube moči. To lahko preverite s skriptom diskchecker.pl, to je bilo ustvaril V 2005 leto.

Ta skript zahteva dva fizična stroja - "strežnik" in "odjemalec". Odjemalec zapiše majhno količino podatkov na testirani disk, pokliče fsync in strežniku pošlje informacije o zapisanem.

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

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

Po zagonu skripta morate izklopiti napajanje »odjemalca« in ga nekaj minut ne vračati. Pomembno je, da osebo, ki se testira, odklopite od elektrike in ne samo izvedete močan izklop. Čez nekaj časa se strežnik lahko poveže in naloži v OS. Ko naložite OS, ga morate znova zagnati diskchecker.pl, vendar z argumentom preverjanje.

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

Na koncu preverjanja boste videli število napak. Če je 0, je disk opravil test. Da bi izključili srečno naključje za disk, lahko poskus večkrat ponovimo.

Naš S4500 ob izpadu napajanja ni pokazal napak, kar pomeni, da je pripravljen na delovne obremenitve z veliko klici fsync.

Zaključek

Pri izbiri diskov ali celotnih že pripravljenih konfiguracij se morate spomniti posebnosti težav, ki jih je treba rešiti. Na prvi pogled se zdi očitno, da je NVMe, torej SSD z vmesnikom PCIe, hitrejši od »klasičnega« SATA SSD. Vendar, kot smo izvedeli danes, v posebnih razmerah in pri določenih nalogah temu morda ne bo tako.

Kako testirate strežniške komponente pri najemu od ponudnika IaaS?
Čakamo vas v komentarjih.

Zakaj je moj NVMe počasnejši kot moj SSD?

Vir: www.habr.com

Dodaj komentar