
Å 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 prepareTestu 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 runTestu 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:
- KÄpÄc testÄ bez fsync lasīŔanas Ätrums pÄrsniedz fizisko kanÄla caurlaidspÄju?
- 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/sdbTests
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 , kas tika 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 verifyPÄ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.
Avots: habr.com
