Prečo je môj NVMe pomalší ako môj SSD?

Prečo je môj NVMe pomalší ako môj SSD?
V tomto článku sa pozrieme na niektoré nuansy I/O subsystému a ich vplyv na výkon.

Pred pár týždňami som stál pred otázkou, prečo bolo NVMe na jednom serveri pomalšie ako SATA na druhom. Pozrel som sa na špecifikácie servera a uvedomil som si, že to bola zložitá otázka: NVMe bolo zo segmentu používateľov a SSD zo segmentu serverov.

Je zrejmé, že nie je fér porovnávať produkty z rôznych segmentov v rôznych prostrediach, ale toto nie je úplná technická odpoveď. Poďme študovať základy, vykonávať experimenty a dať odpoveď na položenú otázku.

Čo je fsync a kde sa používa?

Na urýchlenie práce s jednotkami sa údaje ukladajú do vyrovnávacej pamäte, to znamená, že sa ukladajú do nestálej pamäte, kým sa nenaskytne vhodná príležitosť uložiť obsah vyrovnávacej pamäte na jednotku. Kritériá pre „príležitosť“ sú určené operačným systémom a charakteristikami disku. V prípade výpadku napájania sa stratia všetky údaje vo vyrovnávacej pamäti.

Existuje množstvo úloh, pri ktorých sa musíte uistiť, že zmeny v súbore sa zapíšu na jednotku a nie do medzipamäte. Toto uistenie možno získať pomocou systémového volania fsync kompatibilného s POSIX. Volanie fsync vynúti zápis z vyrovnávacej pamäte na disk.

Ukážme si vplyv vyrovnávacích pamätí na umelom príklade vo forme krátkeho programu 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;
}

Komentáre dobre vysvetľujú postupnosť akcií v programe. Operačný systém uloží do vyrovnávacej pamäte text „odpoveď na hlavnú otázku života, vesmíru a toho všetkého“ a ak reštartujete server stlačením tlačidla Reset počas „výpočtov“, súbor bude prázdny. V našom príklade strata textu nie je problémom, takže fsync nie je potrebný. Databázy tento optimizmus nezdieľajú.

Databázy sú zložité programy, ktoré súčasne pracujú s mnohými súbormi, takže chcú mať istotu, že údaje, ktoré zapisujú, sa uložia na disk, pretože od toho závisí konzistencia údajov v databáze. Databázy sú navrhnuté tak, aby zaznamenávali všetky dokončené transakcie a boli pripravené kedykoľvek stratiť energiu. Toto správanie vyžaduje neustále používanie fsync vo veľkých množstvách.

Aký je účinok častého používania fsync?

Počas normálneho I/O sa operačný systém snaží optimalizovať komunikáciu s diskami, keďže externé disky sú najpomalšie v hierarchii pamäte. Operačný systém sa preto snaží zapísať čo najviac dát pri jednom prístupe na disk.

Ukážme si vplyv používania fsync na konkrétnom príklade. Ako testovacie disky máme nasledujúce SSD:

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

Testy sa vykonávajú na Intel® Xeon® W-2255 so systémom Ubuntu 20.04. Na testovanie diskov sa používa Sysbench 1.0.18. Na diskoch bola vytvorená jedna partícia naformátovaná ako ext4. Príprava na test zahŕňa vytvorenie 100 GB súborov:

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

Priebežné testy:

# Без 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

Výsledky testov sú uvedené v tabuľke.

Test
Intel® S4500
Samsung 970 EVO+

Čítanie bez fsync, MiB/s
5734.89
9028.86

Nahrávanie bez fsync, MiB/s
3823.26
6019.24

Čítanie s fsync, MiB/s
37.76
3.27

Nahrávanie s fsync, MiB/s
25.17
2.18

Je ľahké vidieť, že NVMe z klientskeho segmentu suverénne vedie, keď operačný systém sám rozhoduje o práci s diskami, a prehráva pri použití fsync. To vyvoláva dve otázky:

  1. Prečo rýchlosť čítania v teste bez fsync prekračuje fyzickú šírku pásma kanála?
  2. Prečo je SSD segment servera lepší pri spracovávaní veľkého počtu požiadaviek fsync?

Odpoveď na prvú otázku je jednoduchá: sysbench generuje súbory plné nul. Test sa teda vykonal na 100 gigabajtoch núl. Keďže dáta sú veľmi jednotné a predvídateľné, do hry vstupujú rôzne optimalizácie OS a výrazne urýchľujú vykonávanie.

Ak spochybníte všetky výsledky sysbench, môžete použiť 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+

Čítanie bez fsync, MiB/s
45.5
178

Nahrávanie bez fsync, MiB/s
30.4
119

Čítanie s fsync, MiB/s
32.6
20.9

Nahrávanie s fsync, MiB/s
21.7
13.9

Tendencia poklesu výkonu NVMe pri používaní fsync je jasne viditeľná. Môžete prejsť k odpovedi na druhú otázku.

Optimalizácia alebo blufovanie

Predtým sme povedali, že údaje sú uložené vo vyrovnávacej pamäti, ale nešpecifikovali sme v ktorej, pretože to nebolo dôležité. Ani teraz sa nebudeme ponoriť do zložitosti operačných systémov a poukážeme na dva všeobecné typy vyrovnávacích pamätí:

  • program;
  • hardvér.

Softvérová vyrovnávacia pamäť sa týka vyrovnávacích pamätí, ktoré existujú v operačnom systéme a hardvérová vyrovnávacia pamäť sa týka volatilnej pamäte radiča disku. Systémové volanie fsync posiela na jednotku príkaz na zápis údajov z vyrovnávacej pamäte do hlavného úložného priestoru, ale nemá žiadny spôsob, ako overiť, či je príkaz vykonaný správne.

Keďže SSD vykazuje najlepšie výsledky, možno urobiť dva predpoklady:

  • disk je určený na podobnú záťaž;
  • disk „blafuje“ a ignoruje príkaz.

Nečestné správanie meniča si môžete všimnúť, ak vykonáte test straty napájania. Môžete to skontrolovať pomocou skriptu diskchecker.pl, to bolo vytvoril v roku 2005.

Tento skript vyžaduje dva fyzické stroje – „server“ a „klient“. Klient zapíše malé množstvo údajov na testovaný disk, zavolá fsync a odošle serveru informácie o tom, čo bolo zapísané.

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

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

Po spustení skriptu musíte vypnúť napájanie „klienta“ a niekoľko minút ho nevracať. Dôležité je odpojiť testovanú osobu od elektriny, a nielen vykonať tvrdé vypnutie. Po určitom čase môže byť server pripojený a načítaný do OS. Po načítaní operačného systému ho musíte znova spustiť diskchecker.pl, ale s argumentom overiť si.

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

Na konci kontroly uvidíte počet chýb. Ak je 0, potom disk prešiel testom. Aby sa vylúčila šťastná náhoda pre disk, experiment sa môže opakovať niekoľkokrát.

Náš S4500 nevykazoval žiadne chyby pri strate napájania, čo znamená, že je pripravený na pracovné zaťaženie s množstvom volaní fsync.

Záver

Pri výbere diskov alebo celých hotových konfigurácií by ste mali pamätať na špecifiká problémov, ktoré je potrebné vyriešiť. Na prvý pohľad je zrejmé, že NVMe, teda SSD s rozhraním PCIe, je rýchlejší ako „klasický“ SATA SSD. Ako sme sa však dnes dozvedeli, v špecifických podmienkach a pri určitých úlohách to tak nemusí byť.

Ako testujete komponenty servera pri prenájme od poskytovateľa IaaS?
Čakáme vás v komentároch.

Prečo je môj NVMe pomalší ako môj SSD?

Zdroj: hab.com

Pridať komentár