Kāpēc mans NVMe ir lēnāks par SSD?

Kāpēc mans NVMe ir lēnāks par SSD?
Å ajā rakstā mēs apskatÄ«sim dažus ievades-izvades apakÅ”sistēmas aspektus un to ietekmi uz veiktspēju.

Pirms pāris nedēļām es saskāros ar jautājumu, kāpēc NVMe kādā serverÄ« ir lēnāks nekā SATA citā. Es pārbaudÄ«ju serveru specifikācijas un sapratu, ka Å”is bija maldinoÅ”s jautājums: NVMe bija no patērētāju segmenta, bet SSD — no serveru segmenta.

AcÄ«mredzot nav pareizi salÄ«dzināt produktus no dažādiem segmentiem atŔķirÄ«gā vidē, taču tas nav izsmeļoÅ”s tehnisks atbildes veids. IzpētÄ«sim pamatus, veiksim eksperimentus un sniegsim atbildi uz uzdoto jautājumu.

Kas ir fsync un kur tas tiek izmantots

Lai paātrinātu darbu ar uzglabāŔanas ierÄ«cēm, dati tiek buferēti, tas ir, saglabāti enerÄ£ijas atkarÄ«gā atmiņā, lÄ«dz tiek nodroÅ”ināta izdevÄ«ga iespēja saglabāt bufera saturu uz uzglabāŔanas ierÄ«ces. Kritēriji "izdevÄ«gai situācijai" tiek noteikti operētājsistēmā un uzglabāŔanas ierÄ«ces Ä«paŔībās. Ja strāva izzÅ«d, visi dati buferÄ« tiks zaudēti.

Ir virkne uzdevumu, kuros nepiecieÅ”ams bÅ«t pārliecinātam, ka izmaiņas failā ir ierakstÄ«tas uz uzglabāŔanas ierÄ«ces, nevis atrodas starp buferiem. Å o pārliecÄ«bu var iegÅ«t, izmantojot POSIX saderÄ«gu sistēmas izsaukumu fsync. Izsaukums fsync uzsāk piespiedu ierakstīŔanu no bufera uz uzglabāŔanas ierÄ«ci.

Demonstrēsim buferu ietekmi ar mākslīgu piemēru, izmantojot īsu programmu C valodā.

#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āri labi izskaidro darbÄ«bu secÄ«bu programmā. Teksts "atbilde uz galveno jautājumu par dzÄ«vi, Visumu un visu tāda" tiks buferēts operētājsistēmā, un, ja serveris tiks restartēts, nospiežot Reset pogu laikā "aprēķinos", fails izrādÄ«sies tukÅ”s. MÅ«su piemērā teksta zudums nav problēma, tāpēc fsync nav nepiecieÅ”ams. Datu bāzes ar Ŕādu optimisma izjÅ«tu nekādā ziņā neiznāk.

Datu bāzes ir sarežģītas programmas, kas vienlaicÄ«gi strādā ar daudziem failiem, tāpēc vēlas bÅ«t pārliecinātas, ka ierakstÄ«tie dati tiks saglabāti uzglabāŔanas ierÄ«cē, jo no tā ir atkarÄ«ga datu konsekvence iekŔējā DB. Datu bāzes ir projektētas, lai ierakstÄ«tu visas pabeigtās transakcijas un bÅ«tu gatavas strāvas izslēgÅ”anai jebkurā brÄ«dÄ«. Šāda uzvedÄ«ba nepiecieÅ”ama regulāri izmantot fsync lielā apjomā.

Kā bieža fsync lietoÅ”ana ietekmē veiktspēju

Parastā ieejā-izvadē operētājsistēma cenÅ”as optimizēt saziņu ar diskiem, jo atmiņas hierarhijā ārējie krātāji ir vislēnākie. Tādēļ operētājsistēma cenÅ”as vienā piekļuvē krātājam ierakstÄ«t pēc iespējas vairāk datu.

Demonstrēsim fsync lietoÅ”anas ietekmi uz konkrētu piemēru. MÅ«su eksperimentos piedalās Ŕādi cietvielu krātāji:

  • IntelĀ® DC SSD S4500 480 GB, pieslēgts pa SATA 3.2, 6 Gb/s;
  • Samsung 970 EVO Plus 500GB, pieslēgts pa PCIe 3.0 x4, ~31 Gb/s.

Testi tiek veikti uz IntelĀ® XeonĀ® W-2255, darbojas ar OS Ubuntu 20.04. Disku testēŔanai tiek izmantots sysbench 1.0.18. Diskos ir izveidots viens nodalÄ«jums, formatēts kā ext4. SagatavoÅ”ana testam ietver 100 GB failu izveidi:

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

Testu uzsākŔana:

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

Testu rezultāti ir attēloti tabulā.

Tests
IntelĀ® S4500
Samsung 970 EVO+

LasīŔana bez fsync, MiB/s
5734.89
9028.86

RakstīŔana bez fsync, MiB/s
3823.26
6019.24

LasīŔana ar fsync, MiB/s
37.76
3.27

RakstīŔana ar fsync, MiB/s
25.17
2.18

Nav grÅ«ti pamanÄ«t, ka NVMe no klientu segmenta droÅ”i ieņem vadÄ«bu, kad operētājsistēma pati lemj, kā strādāt ar diskiem, un zaudē, kad tiek izmantots fsync. Å eit rodas divi jautājumi:

  1. Kāpēc testā bez fsync lasīŔanas ātrums pārsniedz fizisko kanāla caurlaidspēju?
  2. Kāpēc serveru segmenta SSD labāk apstrādā lielu skaitu fsync pieprasījumu?

Atbilde uz pirmo jautājumu ir vienkārÅ”a: sysbench Ä£enerē failus, kas piepildÄ«ti ar nullēm. Tādējādi tests tika veikts ar 100 gigabaitiem nullēm. Tā kā dati ir ļoti homogēni un prognozējami, tiek aktÄ«vi izmantotas dažādas OS optimizācijas, kas ievērojami paātrina izpildi.

Ja apŔaubām visus sysbench rezultātus, varam izmantot 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

Tests
IntelĀ® S4500
Samsung 970 EVO+

LasīŔana bez fsync, MiB/s
45.5
178

RakstīŔana bez fsync, MiB/s
30.4
119

LasīŔana ar fsync, MiB/s
32.6
20.9

RakstīŔana ar fsync, MiB/s
21.7
13.9

Tendence uz veiktspējas kritumu NVMe, izmantojot fsync, ir labi pamanāma. Varam pāriet uz atbildi uz otro jautājumu.

Optimizācija vai muļķības

IepriekÅ” mēs runājām, ka dati tiek glabāti buferÄ«, bet neprecizējām, kurā tieÅ”i, jo tas nebija bÅ«tiski. Mēs arÄ« tagad neiedziļināsimies operētājsistēmu niansēs un izdalÄ«sim divus vispārējus buferu veidus:

  • programmatÅ«ras;
  • aparatÅ«ras.

Zem programmatÅ«ras buferiem saprot buferus, kas atrodas operētājsistēmā, savukārt zem aparatÅ«ras — enerÄ£ijai atkarÄ«ga atmiņa diska kontrolierim. Sistēmas izsaukums fsync nosÅ«ta glabātājam komandu ierakstÄ«t datus no tā bufera galvenajā glabātavā, bet nevar kontrolēt komandas izpildes pareizÄ«bu.

Tā kā SSD rāda labākus rezultātus, var izdarīt divus pieņēmumus:

  • disku ir projektēts Ŕādas slodzes ietvaros;
  • disku ā€žapmānaā€ un ignorē komandu.

NegodÄ«ga uzvedÄ«ba no glabātāja puses var tikt novērota, ja veicat testu ar strāvas piegādes pārtraukÅ”anu. To var pārbaudÄ«t ar skriptu diskchecker.pl, kas tika sukurtas izstrādāts 2005. gadā.

Å is skripts prasa divas fiziskas maŔīnas — ā€žserveriā€ un ā€žklientuā€. Klients ieraksta testējamajā diskā nelielu datu apjomu, izsauc fsync un nosÅ«ta serverim informāciju par to, kas tika ierakstÄ«ts.

# Š—Š°ŠæŃƒŃŠŗŠ°ŠµŃ‚ŃŃ на сервере
./diskchecker.pl -l [port]

# Š—Š°ŠæŃƒŃŠŗŠ°ŠµŃ‚ŃŃ на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>

Pēc skripta palaiÅ”anas ir jāatslēdz ā€žklientsā€ no strāvas un nedrÄ«kst to atjaunot dažu minūŔu laikā. Ir svarÄ«gi tieÅ”i atslēgt testējamo no elektrÄ«bas, nevis vienkārÅ”i veikt cieto izslēgÅ”anu. Pēc noteikta laika serveri var pieslēgt un ielādēt operētājsistēmā. Pēc operētājsistēmas ielādes nepiecieÅ”ams atkārtoti palaist diskchecker.pl, bet ar argumentu verify.

.\/diskchecker.pl -s  verify

Pārbaudes beigās jÅ«s redzēsiet kļūdu skaitu. Ja to nav, tas nozÄ«mē, ka disks ir izturējis pārbaudi. Lai izslēgtu veiksmÄ«gas sagadīŔanās iespēju, eksperimentu var atkārtot vairākas reizes.

Mūsu S4500 neuzrādīja kļūdas strāvas zuduma gadījumā, tādējādi var apgalvot, ka tas ir gatavs slodzēm ar lielu fsync izsaukumu skaitu.

Secinājums

Izvēloties diskus vai veselas gatavas konfigurācijas, jāatceras specifika uzdevumiem, kurus nepiecieÅ”ams risināt. PirmŔķiet tas varētu bÅ«t acÄ«mredzams, ka NVMe, proti, SSD ar PCIe saskarni, ir ātrāks nekā ā€žklasiskaisā€ SATA SSD. Tomēr, kā mēs Å”odien sapratām, noteiktos apstākļos un ar noteiktiem uzdevumiem tas var nebÅ«t tā.

Kā jūs testējat serveru komponentes, īrējot pie IaaS pakalpojumu sniedzēja?
Gaidām jūsu komentārus.

Kāpēc mans NVMe ir lēnāks par SSD?

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster