ShĂ«n. pĂ«rk.: ky kjo artikull â pĂ«rmbledhja e njĂ« mini-hetimi tĂ« kryer nga inxhinierĂ«t e IBM Cloud pĂ«r tĂ« gjetur njĂ« zgjidhje pĂ«r njĂ« problem real qĂ« lidhet me operimin e bazĂ«s sĂ« tĂ« dhĂ«nave etcd. PĂ«r ne, njĂ« detyrĂ« e ngjashme ishte e rĂ«ndĂ«sishme, por mĂ«nyra e mendimit dhe veprimeve tĂ« autorĂ«ve mund tĂ« jetĂ« interesante edhe nĂ« njĂ« kontekst mĂ« tĂ« gjerĂ«.

Përmbledhje e shkurtër e gjithë artikullit: fio dhe etcd
Performanca e klasterit etcd varet shumĂ« nga shpejtĂ«sia e depozitĂ«s qĂ« ndodhet nĂ« bazĂ«n e tij. PĂ«r tĂ« monitoruar performancĂ«n, etcd eksporton metrika tĂ« ndryshme Prometheus. NjĂ«ra prej tyre Ă«shtĂ« wal_fsync_duration_seconds. NĂ« dokumentacionin e etcd , depozita mund tĂ« konsiderohet mjaft e shpejtĂ« nĂ«se 99 pĂ«rqind e kĂ«saj metrike nuk e kalon 10 msâŠ
Nëse po mendoni për mundësinë e organizimit të një klasteri etcd në makina të drejtuara nga Linux dhe dëshironi të verifikoni nëse depozitat janë mjaft të shpejta (p.sh., SSD), rekomandojmë të përdorni testuesin popullor të I/O i quajtur . Mjafton të ekzekutoni këtë komandë (direktorja test-data duhet të jetë e vendosur në partitionin e montuar të depozitës që po testoni):
fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytestMjafton të shihni rezultatin dhe të kontrolloni nëse 99 përqind e ndodhet brenda 10 ms. Nëse po, atëherë depozita juaj funksionon mjaft shpejt. Ja një shembull rezultati:
fsync/fdatasync/sync_file_range:
sync (usec): min=534, max=15766, avg=1273.08, stdev=1084.70
sync percentiles (usec):
| 1.00th=[ 553], 5.00th=[ 578], 10.00th=[ 594], 20.00th=[ 627],
| 30.00th=[ 709], 40.00th=[ 750], 50.00th=[ 783], 60.00th=[ 1549],
| 70.00th=[ 1729], 80.00th=[ 1991], 90.00th=[ 2180], 95.00th=[ 2278],
| 99.00th=[ 2376], 99.50th=[ 9634], 99.90th=[15795], 99.95th=[15795],
| 99.99th=[15795]Disa vërejtje:
- Në shembullin e mësipërm ne përshtatëm parametrat
--sizedhe--bspër rastin specifik. Për të marrë një rezultat përmbajtësor ngafio, jepni vlerat që përshtaten me skenarin tuaj të përdorimit. Si t'i zgjidhni ato do të diskutohet më poshtë. - Gjatë testimit, vetëm
fiongarkon sistemin e dyshemesë. Në jetën reale, është mjaft e mundshme që disku të shkruajë edhe procese të tjera (përveç atyre që lidhen mewal_fsync_duration_seconds). Kjo ngarkesë shtesë mund të çojë në rritjen ewal_fsync_duration_seconds. Në të tjera fjalë, nëse 99 përqind e marrë nga testimi mefio, është vetëm pak më poshtë 10 ms, ka një shans të madh që performanca e depozitës të jetë e pamjaftueshme. - Për testin, do t'ju duhet një version
fiojo më i ulët se 3.5, sepse versionet më të vjetra nuk agregojnë rezultatetfdatasyncnë formën e përqindjeve. - Rezultati më sipër është vetëm një fraksion i rezultatit total
fio.
Detajet mbi fio dhe etcd
Disa fjalë rreth WAL-eve të etcd
Si rregull, bazat e të dhënave përdorin (write-ahead logging, WAL). Kjo vlen edhe për etcd. Diskutimi mbi WAL-i del jashtë kësaj artikulli, por për qëllimet tona duhet të dimë se: çdo anëtar i klasterit etcd ruan WAL në një depo të përhershme. etcd regjistron disa operacione me magazinën key-value (p.sh., përditësimet) në WAL, para se t'i kryejë ato. Nëse një nyje rrëzohet dhe riaktivizohet midis snapshot-eve, etcd mund të rikuperojë transaksionet e kryera nga snapshot-i i mëparshëm, duke u orientuar nga përmbajtja e WAL.
KĂ«shtu, çdo herĂ« qĂ« njĂ« klient shton njĂ« çelĂ«s nĂ« magazinĂ«n KV ose pĂ«rditĂ«son vlerĂ«n e njĂ« çelĂ«si ekzistues, etcd shton njĂ« pĂ«rshkrim tĂ« operacionit nĂ« WAL, i cili Ă«shtĂ« njĂ« skedĂ« e zakonshme nĂ« shpĂ«rndarjen e pĂ«rhershme. Para se tĂ« vazhdojĂ« me punĂ«n, etcd DUHET tĂ« jetĂ« 100% e sigurt se shkrimi nĂ« WAL nĂ« tĂ« vĂ«rtetĂ« Ă«shtĂ« ruajtur. PĂ«r ta siguruar kĂ«tĂ« nĂ« Linux, nuk mjafton tĂ« pĂ«rdorni thirrjen e sistemit , sepse operacioni i vetĂ« shkrimit nĂ« mbajtĂ«s fizik mund tĂ« jetĂ« i vonuar. PĂ«r shembull, Linux mund tĂ« mbajĂ« regjistrimin e WAL nĂ« memorjen e kernelit pĂ«r njĂ« kohĂ« (p.sh., nĂ« cache-n e faqeve). PĂ«r tĂ« garantuar qĂ« tĂ« dhĂ«nat e shkruara i janĂ« dĂ«rguar mbajtĂ«sit, pas shkrimit Ă«shtĂ« e nevojshme tĂ« aktivizoni thirrjen e sistemit fdatasync â kĂ«shtu vepron etcd (siç shihet nĂ« shembullin mĂ« poshtĂ« ; kĂ«tu 8 â deshifruesi i skedĂ«s WAL):
21:23:09.894875 lseek(8, 0, SEEK_CUR) = 12808
21:23:09.894911 write(8, ". 20210220361223255266632$10 20103026"34"rn3fo"..., 2296) = 2296
21:23:09.895041 fdatasync(8) = 0 Fatkeqësisht, shkrimi në mbajtësin e përhershëm kërkon disa kohë. Vonesat në ekzekutimin e thirrjes fdatasync mund të ndikojnë në performancën e etcd. Në dokumentacionin e depozitës , për të pasur performancë të mjaftueshme, është e domosdoshme që 99 përqind e kohës së të gjitha thirrjeve fdatasync në shkrimin në skedën WAL të jetë më e vogël se 10 ms. Ekzistojnë edhe metrika të tjera që lidhen me depozitën, por në këtë artikull do të bisedohet veçanërisht për këtë.
Vlerësimi i depozitës me fio
PĂ«r tĂ« vlerĂ«suar nĂ«se njĂ« depo Ă«shtĂ« e pĂ«rshtatshme pĂ«r pĂ«rdorim me etcd, mund tĂ« pĂ«rdorni utilitarin â testues i njohur I/O. Mbani parasysh se hyrja-dalja e diskut mund tĂ« ndodhĂ« nĂ« mĂ«nyra tĂ« ndryshme: sync/asynchronous, shumĂ« klasa tĂ« ndryshme thirrjesh sistemore, etj. AnĂ« tjetĂ«r e medaljes Ă«shtĂ« se fio shumĂ« e komplikuar pĂ«r t'u pĂ«rdorur. NjĂ« mjet ka shumĂ« parametra, dhe kombinime tĂ« ndryshme tĂ« vlerave tĂ« tyre japin rezultate krejtĂ«sisht tĂ« ndryshme. PĂ«r tĂ« marrĂ« njĂ« vlerĂ«sim tĂ« arsyeshĂ«m nĂ« rastin e etcd, duhet tĂ« siguroheni qĂ« ngarkesa e shkrimit e gjeneruar nga fio, tĂ« jetĂ« sa mĂ« afĂ«r ngarkesĂ«s sĂ« etcd kur shkruan nĂ« skedarĂ«t WAL:
- Kjo do të thotë se ngarkesa e
fioduhet të përbëhet të paktën nga një seri shkrimesh të njëpasnjëshme në skedarin, ku çdo operacion shkrimi përbëhet nga një thirrje sistemore , e ndjekur ngafdatasync. - Për të aktivizuar shkrimin e njëpasnjëshëm, nevojitet të përcaktohet flamuri
--rw=write. - Për
fioshkruante me thirrjeshkruaj(dhe jo thirrje tĂ« tjera sistemore â pĂ«r shembull, ), pĂ«rdorni flamurin--ioengine=sync. - MĂ« nĂ« fund, flamuri
--fdatasync=1garanton që pas çdoshkruajduhetfdatasync. - Dy parametrat e tjerë në shembullin tonë:
--sizedhe--bsâ mund tĂ« ndryshojnĂ« nĂ« varĂ«si tĂ« skenarit tĂ« veçantĂ« tĂ« pĂ«rdorimit. NĂ« seksionin nĂ« vijim do tĂ« pĂ«rshkruhet konfigurimi i tyre.
Pse zgjodhëm fio dhe nga mësuam si ta konfigurojmë
Ky shënim lindi nga një rast real me të cilin u përballëm. Kishim një klaster në Kubernetes v1.13 me monitorim nga Prometheus. Si depo për etcd v3.2.24 shërbenin disqe solid state. Metritë e etcd treguan vonesa shumë të larta fdatasync, edhe kur klasteri ishte i ndaluar. Këto metritë na dukej se ishin shumë të dyshimta, dhe nuk ishim të sigurt se çfarë përfaqësonin. Për më tepër, klasteri përbënte makineri virtuale, kështu që nuk ishte e mundur të thuhej nëse vonesa kishte të bënte me virtualizimin apo nëse SSD ishin fajtorët.
Për më tepër, ne shqyrtuam ndryshime të ndryshme në konfigurimin e harduerit dhe softuerit, prandaj ishte e nevojshme një mënyrë për t'i vlerësuar ato. Sigurisht, mund të ishte nisur etcd në çdo konfigurim dhe të shihnim metritë përkatëse të Prometheus-it, por kjo do të kërkonte përpjekje të mëdha. Na duhet një mënyrë e thjeshtë për të vlerësuar një konfigurim të veçantë. Dëshironim të testonim kuptimin tonë të metrisë së Prometheus-it që vijnë nga etcd.
Për këtë, duhej të zgjidheshin dy probleme:
- Së pari, si duket ngarkesa I/O e gjeneruar nga etcd kur shkruan në skedarët WAL? Cilat thirrje sistemore përdoren? Cili është madhësia e bllokut të shkrimit?
- Së dyti, le të thoni se kemi përgjigje për pyetjet e mësipërme. Si të riprodhojmë ngarkesën përkatëse me
fio? ĐДЎŃfioâ njĂ« mjet shumĂ« fleksibĂ«l me njĂ« mori parametrash (e qartĂ« nĂ« kĂ«tĂ« mĂ«nyrĂ«, pĂ«r shembull, Ââ shĂ«n. pĂ«rkth.).
Ne solucionuam të dy problemet me një qasje të njëjtë, duke u mbështetur në komandat dhe :
- Me
lsofmund të shikoni të gjitha deshkriptorët e skedarëve që përdoren nga procesi, si dhe skedarët me të cilët janë lidhur. - Me
stracemund të analizoni një proces të ndaluar ose të nisni një proces dhe ta vështroni atë. Komanda nxjerr të gjitha thirrjet sistemore të kryera nga ky proces dhe, nëse është e nevojshme, pasardhësit e tij. E fundit është e rëndësishme për proceset që forkohen, dhe etcd është një nga këto procese.
E para që bëmë ishte të përdorim strace për të hulumtuar serverin etcd në klasterin Kubernetes, për sa kohë që ai ishte i ndaluar.
U zbulua kĂ«shtu se blloqet e shkrimit nĂ« WAL janĂ« shumĂ« tĂ« grumbulluara ngushtĂ«, dhe madhĂ«sia e shumicĂ«s ishte nĂ« intervalin 2200-2400 byte. Kjo Ă«shtĂ« arsyeja pse nĂ« komandĂ«n nĂ« fillim tĂ« kĂ«tij artikulli ndodhet flamuri --bs=2300 (bs â madhĂ«sia nĂ« byte e secilit bllok shkrimi nĂ« fio).
Vini re se madhĂ«sia e bllokut tĂ« shkrimit nĂ« etcd mund tĂ« ndryshojĂ« nĂ« varĂ«si tĂ« versionit, deploy-it, vlerave tĂ« parametrave, etj. â kjo ndikon nĂ« gjatĂ«si fdatasync. NĂ«se keni njĂ« skenar tĂ« ngjashĂ«m pĂ«rdorimi, analizoni me ndihmĂ«n e strace proceset tuaja etcd pĂ«r tĂ« marrĂ« vlera aktuale.
Pastaj, për të marrë një pamje të qartë dhe gjithëpërfshirëse të punës së etcd me sistemin e skedarëve, e nisëm atë nga strace me flamujt -ffttT. Kjo lejoj që të mbuloheshin proceset pasardhëse dhe të shkruhej dalja e secilës në një skedar të veçantë. Për më tepër, u arritën informacione të detajuara mbi momentin e nismës dhe gjatësi e çdo thirrje sistemore.
Ishim gjithashtu të siguruar me komandën lsof, për të konfirmuar kuptimin tonë të daljes strace në lidhje me se cilin deshkriptor skedari është përdorur për cilin qëllim. U krijua një dalje strace, e ngjashme me atë që u paraqit më sipër. Manipulimet statistikore me kohët e sinkronizimit konfirmuan se metrika wal_fsync_duration_seconds nga etcd përputhet me thirrjet fdatasync me deshkriptorët e skedarëve WAL.
Për të gjeneruar me ndihmën e fio Ngarkesa e punës, e ngjashme me ngarkesën nga etcd, u studiuan dokumentet e utilitarit dhe u përcaktuan parametrat e përshtatshëm për detyrën tonë. Ne u siguruam që thirrjet sistemore të nevojshme ishin aktivizuar dhe konfirmuam kohëzgjatjen e tyre përmes ekzekutimit fio nga strace (siç u bë në rastin e etcd).
Vëmendje e veçantë iu kushtua përcaktimit të vlerës së parametrave --size. Ai përfaqëson ngarkesën totale I/O, e gjeneruar nga utilitari fio. Në rastin tonë, kjo është numri i plotë i byte-ve të shkruara në media. Ai është drejtpërdrejt proporcional me numrin e thirrjeve shkruaj (dhe fdatasync). Për një bs numër thirrjesh fdatasync është e barabartë me size / bs.
Pasi na interesonte percentili, ne kërkuam që numri i mostrave të ishte mjaft i madh për rëndësinë statistike. Dhe vendosëm se 10^4 ( që përkon me një madhësi prej 22 Mb) do të ishte e mjaftueshme. Vlerat më të vogla të parametrave --size jepnin më shumë zhurmë (p.sh., thirrjet fdatasync, që zënë më shumë kohë sesa zakonisht dhe ndikojnë në percentilin e 99-të).
Puna është e juaja
Artikulli tregon se si me ndihmën e fio mund të vlerësohet nëse media e destinuar për përdorim me etcd është mjaft e shpejtë. Tani puna është e juaja! Të eksploroni makinat virtuale me ruajtje të bazuar në SSD mund të bëhet në shërbimin .
P.S. nga përkthyesi
Me shembuj të gatshëm të përdorimit fio për zgjidhjen e detyrave të tjera mund të njiheni në ose drejtpërdrejt në (aty janë paraqitur shumë më tepër, sesa përmenden në dokumentacion).
P.P.S. nga përkthyesi
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «».
Burimi: habr.com
