Å ajÄ rakstÄ apskatÄ«sim dažas I/O apakÅ”sistÄmas nianses un to ietekmi uz veiktspÄju.
Pirms pÄris nedÄļÄm saskÄros ar jautÄjumu, kÄpÄc NVMe vienÄ serverÄ« bija lÄnÄks nekÄ SATA citÄ. Es paskatÄ«jos uz servera specifikÄcijÄm un sapratu, ka tas ir sarežģīts jautÄjums: NVMe bija no lietotÄju segmenta, un SSD bija no servera segmenta.
AcÄ«mredzot nav godÄ«gi salÄ«dzinÄt dažÄdu segmentu produktus dažÄdÄs vidÄs, taÄu tÄ nav pilnÄ«ga tehniskÄ atbilde. IzpÄtÄ«sim pamatus, veiksim eksperimentus un sniegsim atbildi uz uzdoto jautÄjumu.
Kas ir fsync un kur to izmanto?
Lai paÄtrinÄtu darbu ar diskdziÅiem, dati tiek buferizÄti, tas ir, tiek glabÄti nepastÄvÄ«gajÄ atmiÅÄ, lÄ«dz parÄdÄs Ärta iespÄja saglabÄt bufera saturu diskdzinÄ«. āIespÄjasā kritÄrijus nosaka operÄtÄjsistÄma un diskdziÅa raksturlielumi. StrÄvas padeves pÄrtraukuma gadÄ«jumÄ visi buferÄ« esoÅ”ie dati tiks zaudÄti.
Ir vairÄki uzdevumi, kuros jums ir jÄpÄrliecinÄs, ka faila izmaiÅas tiek ierakstÄ«tas diskdzinÄ«, nevis starpposma buferÄ«. Å o pÄrliecÄ«bu var iegÅ«t, izmantojot POSIX saderÄ«gu fsync sistÄmas izsaukumu. Fsync izsaukÅ”ana liek rakstÄ«t no bufera uz disku.
DemonstrÄsim buferu efektu ar mÄkslÄ«gu piemÄru Ä«sas programmas veidÄ 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Ä«vÄ«bu, Visumu un visu toā tiks buferÄts ar operÄtÄjsistÄmu, un, ja āaprÄÄ·inuā laikÄ restartÄsit serveri, nospiežot pogu Reset, fails bÅ«s tukÅ”s. MÅ«su piemÄrÄ teksta zudums nav problÄma, tÄpÄc fsync nav nepiecieÅ”ams. Datu bÄzes nepiekrÄ«t Å”im optimismam.
Datu bÄzes ir sarežģītas programmas, kas vienlaikus strÄdÄ ar daudziem failiem, tÄpÄc viÅi vÄlas bÅ«t pÄrliecinÄti, ka viÅu rakstÄ«tie dati tiks saglabÄti diskdzinÄ«, jo no tÄ ir atkarÄ«ga datu konsekvence datu bÄzÄ. Datu bÄzes ir paredzÄtas, lai reÄ£istrÄtu visus pabeigtos darÄ«jumus un bÅ«tu gatavas jebkurÄ laikÄ zaudÄt enerÄ£iju. Å Ä« darbÄ«ba prasa fsync nepÄrtrauktu izmantoÅ”anu lielos daudzumos.
KÄdas ir biežas fsync lietoÅ”anas sekas?
ParastÄ I/O laikÄ operÄtÄjsistÄma mÄÄ£ina optimizÄt saziÅu ar diskiem, jo āāÄrÄjie diskdziÅi ir vislÄnÄkie atmiÅas hierarhijÄ. TÄpÄc operÄtÄjsistÄma mÄÄ£ina ierakstÄ«t pÄc iespÄjas vairÄk datu vienÄ pieejÄ diskam.
ParÄdÄ«sim fsync izmantoÅ”anas ietekmi ar konkrÄtu piemÄru. Mums ir Å”Ädi SSD kÄ testa diski:
- IntelĀ® DC SSD S4500 480 GB, savienots, izmantojot SATA 3.2, 6 Gbit/s;
- Samsung 970 EVO Plus 500GB, savienots caur PCIe 3.0 x4, ~31 Gbit/s.
Testi tiek veikti ar IntelĀ® XeonĀ® W-2255, kurÄ darbojas Ubuntu 20.04. Disku testÄÅ”anai tiek izmantota Sysbench 1.0.18. Diskos ir izveidots viens nodalÄ«jums, kas formatÄts kÄ ext4. SagatavoÅ”anÄs pÄrbaudei ietver 100 GB failu izveidi:
sysbench --test=fileio --file-total-size=100G prepare
SkrieŔanas 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
PÄrbaudes rezultÄti ir parÄdÄ«ti tabulÄ.
PÄrbaude
IntelĀ® S4500
Samsung 970 EVO+
LasīŔana bez fsync, MiB/s
5734.89
9028.86
Ieraksts bez fsync, MiB/s
3823.26
6019.24
LasīŔana ar fsync, MiB/s
37.76
3.27
Ieraksts ar fsync, MiB/s
25.17
2.18
Ir viegli redzÄt, ka NVMe no klientu segmenta pÄrliecinoÅ”i ir vadÄ«bÄ, kad operÄtÄjsistÄma pati izlemj, kÄ strÄdÄt ar diskiem, un zaudÄ, kad tiek izmantots fsync. Tas rada divus jautÄjumus:
- KÄpÄc lasÄ«Å”anas Ätrums testÄ bez fsync pÄrsniedz kanÄla fizisko joslas platumu?
- KÄpÄc servera segmenta SSD labÄk apstrÄdÄ lielu skaitu fsync pieprasÄ«jumu?
Atbilde uz pirmo jautÄjumu ir vienkÄrÅ”a: sysbench Ä£enerÄ failus, kas aizpildÄ«ti ar nullÄm. TÄdÄjÄdi tests tika veikts vairÄk nekÄ 100 gigabaitu nulles. TÄ kÄ dati ir ļoti viendabÄ«gi un paredzami, tiek izmantotas dažÄdas OS optimizÄcijas, kas ievÄrojami paÄtrina izpildi.
Ja apÅ”aubÄt visus sysbench rezultÄtus, varat 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
PÄrbaude
IntelĀ® S4500
Samsung 970 EVO+
LasīŔana bez fsync, MiB/s
45.5
178
Ieraksts bez fsync, MiB/s
30.4
119
LasīŔana ar fsync, MiB/s
32.6
20.9
Ieraksts ar fsync, MiB/s
21.7
13.9
Ir skaidri redzama tendence pasliktinÄties NVMe veiktspÄjai, izmantojot fsync. JÅ«s varat pÄriet uz atbildi uz otro jautÄjumu.
OptimizÄcija vai blefs
IepriekÅ” mÄs teicÄm, ka dati tiek glabÄti buferÄ«, bet mÄs nenorÄdÄ«jÄm, kurÅ” no tiem, jo āātas nebija svarÄ«gi. Pat tagad mÄs neiedziļinÄsimies operÄtÄjsistÄmu sarežģītÄ«bÄ un izcelsim divus vispÄrÄ«gus buferu veidus:
- programma;
- aparatūra.
ProgrammatÅ«ras buferis attiecas uz buferiem, kas pastÄv operÄtÄjsistÄmÄ, un aparatÅ«ras buferis attiecas uz diska kontrollera nepastÄvÄ«go atmiÅu. Fsync sistÄmas izsaukums nosÅ«ta diskam komandu, lai rakstÄ«tu datus no tÄ bufera uz galveno krÄtuvi, bet nevar pÄrbaudÄ«t, vai komanda ir izpildÄ«ta pareizi.
TÄ kÄ SSD uzrÄda vislabÄkos rezultÄtus, var izdarÄ«t divus pieÅÄmumus:
- disks ir paredzÄts lÄ«dzÄ«gai slodzei;
- disks "blefo" un ignorÄ komandu.
PiedziÅas negodÄ«gu rÄ«cÄ«bu var pamanÄ«t, veicot jaudas zuduma testu. To var pÄrbaudÄ«t ar skriptu
Å im skriptam ir nepiecieÅ”amas divas fiziskas maŔīnas - āserverisā un āklientsā. Klients ieraksta nelielu datu apjomu pÄrbaudÄmajÄ diskÄ, izsauc fsync un nosÅ«ta serverim informÄciju par rakstÄ«to.
# ŠŠ°ŠæŃŃŠŗŠ°ŠµŃŃŃ Š½Š° ŃŠµŃŠ²ŠµŃŠµ
./diskchecker.pl -l [port]
# ŠŠ°ŠæŃŃŠŗŠ°ŠµŃŃŃ Š½Š° ŠŗŠ»ŠøŠµŠ½ŃŠµ
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>
PÄc skripta palaiÅ”anas jums ir jÄizslÄdz strÄva "klientam" un vairÄkas minÅ«tes neatgrieziet baroÅ”anu. Ir svarÄ«gi atvienot pÄrbaudÄmo personu no elektrÄ«bas, nevis tikai veikt spÄcÄ«gu izslÄgÅ”anu. PÄc kÄda laika serveri var izveidot savienojumu un ielÄdÄt OS. PÄc operÄtÄjsistÄmas ielÄdes tÄ ir jÄsÄk no jauna diskchecker.pl, bet ar argumentu pÄrbaudÄ«t.
./diskchecker.pl -s <server[:port]> verify <file>
PÄrbaudes beigÄs redzÄsit kļūdu skaitu. Ja ir 0, disks ir izturÄjis pÄrbaudi. Lai izslÄgtu diska laimÄ«go sakritÄ«bu, eksperimentu var atkÄrtot vairÄkas reizes.
MÅ«su S4500 neuzrÄdÄ«ja kļūdas, kad tika zaudÄta jauda, āākas nozÄ«mÄ, ka tas ir gatavs darba slodzei ar daudziem fsync zvaniem.
SecinÄjums
IzvÄloties diskus vai veselas gatavÄs konfigurÄcijas, jÄatceras risinÄmo problÄmu specifika. No pirmÄ acu uzmetiena Ŕķiet acÄ«mredzams, ka NVMe, tas ir, SSD ar PCIe interfeisu, ir ÄtrÄks nekÄ āklasiskaisā SATA SSD. TomÄr, kÄ mÄs Å”odien uzzinÄjÄm, Ä«paÅ”os apstÄkļos un ar noteiktiem uzdevumiem tas var nebÅ«t.
KÄ pÄrbaudÄ«t servera komponentus, Ä«rÄjot no IaaS pakalpojumu sniedzÄja?
GaidÄm jÅ«s komentÄros.
Avots: www.habr.com