Hoekom is my NVMe stadiger as 'n SSD?

Hoekom is my NVMe stadiger as 'n SSD?
In hierdie artikel sal ons kyk na sommige van die nuanses van die I/O-substelsel en hul impak op werkverrigting.

'n Paar weke gelede het ek gekonfronteer met die vraag waarom NVMe op een bediener stadiger was as SATA op 'n ander. Ek het na die bedienerspesifikasies gekyk en besef dat dit 'n moeilike vraag was: NVMe was van die gebruikerssegment, en SSD was van die bedienersegment.

Dit is natuurlik nie regverdig om produkte van verskillende segmente in verskillende omgewings te vergelyk nie, maar dit is nie 'n volledige tegniese antwoord nie. Kom ons bestudeer die basiese beginsels, voer eksperimente uit en gee 'n antwoord op die vraag wat gestel is.

Wat is fsync en waar word dit gebruik?

Om werk met aandrywers te bespoedig, word data gebuffer, dit wil sê, in vlugtige geheue gestoor totdat 'n gerieflike geleentheid hom voordoen om die inhoud van die buffer op die aandrywer te stoor. Die kriteria vir 'n "geleentheid" word bepaal deur die bedryfstelsel en die eienskappe van die aandrywer. In die geval van 'n kragonderbreking sal alle data in die buffer verlore gaan.

Daar is 'n aantal take waarin jy seker moet wees dat veranderinge aan 'n lêer na die skyf geskryf word en nie in 'n tussenbuffer nie. Hierdie versekering kan verkry word deur die POSIX-voldoenende fsync-stelseloproep te gebruik. Die oproep van fsync dwing 'n skryf van die buffer na die aandrywer af.

Kom ons demonstreer die effek van buffers met 'n kunsmatige voorbeeld in die vorm van 'n kort program in 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;
}

Die kommentaar verduidelik die volgorde van aksies in die program goed. Die teks "die antwoord op die hoofvraag van die lewe, die heelal en alles wat" sal deur die bedryfstelsel gebuffer word, en as jy die bediener herbegin deur die Herstel-knoppie te druk tydens "berekeninge", sal die lêer leeg wees. In ons voorbeeld is teksverlies nie 'n probleem nie, dus is fsync nie nodig nie. Databasisse deel nie hierdie optimisme nie.

Databasisse is komplekse programme wat gelyktydig met baie lêers werk, so hulle wil seker wees dat die data wat hulle skryf op die skyf gestoor sal word, aangesien die konsekwentheid van die data binne die databasis hiervan afhang. Databasisse is ontwerp om alle voltooide transaksies op te teken en gereed te wees om enige tyd krag te verloor. Hierdie gedrag vereis die gebruik van fsync voortdurend in groot hoeveelhede.

Wat is die effek van gereelde gebruik van fsync?

Tydens normale I/O probeer die bedryfstelsel om kommunikasie met skywe te optimaliseer, aangesien eksterne aandrywers die stadigste in die geheuehiërargie is. Daarom probeer die bedryfstelsel soveel data as moontlik in een toegang tot die skyf skryf.

Kom ons demonstreer die impak van die gebruik van fsync met 'n spesifieke voorbeeld. Ons het die volgende SSD's as toetsaandrywers:

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

Toetse word uitgevoer op 'n Intel® Xeon® W-2255 met Ubuntu 20.04. Sysbench 1.0.18 word gebruik om skywe te toets. Een partisie is op die skywe geskep, geformateer as ext4. Voorbereiding vir die toets behels die skep van 100 GB-lêers:

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

Looptoetse:

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

Die toetsresultate word in die tabel aangebied.

Toets
Intel® S4500
Samsung 970 EVO+

Lees sonder fsync, MiB/s
5734.89
9028.86

Opname sonder fsync, MiB/s
3823.26
6019.24

Lees met fsync, MiB/s
37.76
3.27

Opname met fsync, MiB/s
25.17
2.18

Dit is maklik om te sien dat NVMe van die kliëntsegment met selfvertroue aan die voorpunt is wanneer die bedryfstelsel self besluit hoe om met skywe te werk, en verloor wanneer fsync gebruik word. Dit laat twee vrae ontstaan:

  1. Waarom oorskry die leesspoed in die toets sonder fsync die fisiese bandwydte van die kanaal?
  2. Waarom is 'n bedienersegment-SSD beter om groot getalle fsync-versoeke te hanteer?

Die antwoord op die eerste vraag is eenvoudig: sysbench genereer lêers gevul met nulle. Die toets is dus oor 100 gigagrepe se nulle uitgevoer. Aangesien die data baie eenvormig en voorspelbaar is, kom verskeie OS-optimalisasies ter sprake en bespoedig uitvoering aansienlik.

As jy alle sysbench-resultate bevraagteken, kan jy fio gebruik.

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

Toets
Intel® S4500
Samsung 970 EVO+

Lees sonder fsync, MiB/s
45.5
178

Opname sonder fsync, MiB/s
30.4
119

Lees met fsync, MiB/s
32.6
20.9

Opname met fsync, MiB/s
21.7
13.9

Die neiging vir NVMe-werkverrigting om te verswak wanneer fsync gebruik word, is duidelik sigbaar. Jy kan voortgaan om die tweede vraag te beantwoord.

Optimalisering of bluf

Voorheen het ons gesê dat die data in 'n buffer gestoor word, maar ons het nie gespesifiseer watter een nie, aangesien dit nie belangrik was nie. Selfs nou sal ons nie in die ingewikkeldhede van bedryfstelsels delf nie en sal ons twee algemene tipes buffers uitlig:

  • program;
  • hardeware.

Die sagtewarebuffer verwys na die buffers wat in die bedryfstelsel bestaan, en die hardewarebuffer verwys na die vlugtige geheue van die skyfbeheerder. Die fsync-stelseloproep stuur 'n opdrag na die aandrywer om data vanaf sy buffer na die hoofberging te skryf, maar het geen manier om te verifieer dat die opdrag korrek uitgevoer is nie.

Aangesien die SSD die beste resultate toon, kan twee aannames gemaak word:

  • die skyf is ontwerp vir 'n soortgelyke vrag;
  • die skyf "bluf" en ignoreer die opdrag.

Die oneerlike gedrag van die aandrywer kan opgemerk word as jy 'n kragverliestoets uitvoer. Jy kan dit met 'n skrif kontroleer diskchecker.pl, dit was gestig in 2005 jaar.

Hierdie skrif vereis twee fisiese masjiene - 'n "bediener" en 'n "kliënt". Die kliënt skryf 'n klein hoeveelheid data na die skyf wat getoets word, roep fsync en stuur inligting na die bediener oor wat geskryf is.

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

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

Nadat u die skrip uitgevoer het, moet u die krag na die "kliënt" afskakel en nie die krag vir 'n paar minute teruggee nie. Dit is belangrik om die persoon wat getoets word van elektrisiteit te ontkoppel, en nie net 'n harde afskakeling uit te voer nie. Na 'n rukkie kan die bediener gekoppel word en in die bedryfstelsel gelaai word. Nadat u die bedryfstelsel gelaai het, moet u dit weer begin diskchecker.pl, maar met 'n argument verifieer.

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

Aan die einde van die kontrole sal jy die aantal foute sien. As daar 0 is, dan het die skyf die toets geslaag. Om 'n gelukkige toeval vir die skyf uit te sluit, kan die eksperiment verskeie kere herhaal word.

Ons S4500 het geen foute getoon toe krag verloor is nie, wat beteken dat dit gereed is vir werkladings met baie fsync-oproepe.

Gevolgtrekking

Wanneer u skywe of volledige gereedgemaakte konfigurasies kies, moet u die besonderhede van die probleme wat opgelos moet word, onthou. Met die eerste oogopslag lyk dit duidelik dat NVMe, dit wil sê 'n SSD met 'n PCIe-koppelvlak, vinniger is as die "klassieke" SATA SSD. Soos ons vandag geleer het, kan dit in spesifieke omstandighede en met sekere take egter nie die geval wees nie.

Hoe toets u bedienerkomponente wanneer u van 'n IaaS-verskaffer huur?
Ons wag vir jou in die kommentaar.

Hoekom is my NVMe stadiger as 'n SSD?

Bron: will.com

Voeg 'n opmerking