
En kort historia om fio och etcd
Prestanda för klustret beror i stor utstrĂ€ckning pĂ„ prestandan hos dess lagring. etcd exporterar vissa mĂ€tvĂ€rden till , för att ge nödvĂ€ndig information om lagringsprestanda. Till exempel mĂ€tvĂ€rdet wal_fsync_duration_seconds. : för att lagringen ska anses tillrĂ€ckligt snabb, mĂ„ste 99:e percentilen av detta mĂ€tvĂ€rde vara mindre Ă€n 10 ms. Om du planerar att köra ett etcd-kluster pĂ„ Linux-maskiner och vill bedöma om din lagring Ă€r tillrĂ€ckligt snabb (till exempel SSD), kan du anvĂ€nda â ett populĂ€rt verktyg för att testa in- och utmatningsoperationer. Kör följande kommando, dĂ€r test-data Ă€r en katalog under monteringspunkten för lagringen:
fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytestDu behöver bara titta pÄ resultaten och kontrollera att 99:e percentilen av varaktigheten Àr mindre Àn 10 ms. Om sÄ Àr fallet, har du tillrÀckligt snabb lagring. HÀr Àr ett exempel pÄ resultat:
sync (usec): min=534, max=15766, avg=1273.08, stdev=1084.70
sync percentiler (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]Anteckningar
- Vi har konfigurerat parameterstorlekarna âsize och âbs för vĂ„rt specifika scenario. För att fĂ„ anvĂ€ndbara resultat frĂ„n fio, ange dina vĂ€rden. Var fĂ„r man dem ifrĂ„n? LĂ€s, .
- Under testning kommer hela in- och utmatningsbelastningen frÄn fio. I ett verkligt scenario kommer det förmodligen ocksÄ att komma andra skrivförfrÄgningar till lagringen, utöver de som Àr relaterade till wal_fsync_duration_seconds. Ytterligare belastning ökar vÀrdet pÄ wal_fsync_duration_seconds. SÄ om 99:e percentilen nÀstan nÄr 10 ms, kommer din lagring inte att vara tillrÀckligt snabb.
- AnvÀnd version inte lÀgre Àn 3.5 (tidigare versioner visar inte percentiler av varaktigheten för fdatasync).
- OvanstÄende visar endast ett urval av resultaten frÄn fio.
En lÄng historia om fio och etcd
Vad Àr WAL i etcd
Vanligtvis anvÀnder databaser ; etcd anvÀnder ocksÄ det. HÀr kommer vi inte att diskutera journalen för write-ahead log (WAL) i detalj. Vi behöver bara veta att varje medlem av etcd-klustret hÄller den i ett permanent lagringsutrymme. etcd registrerar varje operation med nyckel-vÀrde-par (till exempel uppdatering) i WAL innan de tillÀmpas i lagringen. Om en av medlemmarna i lagringen kraschar och startar om mellan ögonblicksbilder kan den ÄterstÀlla transaktioner lokalt frÄn den senaste ögonblicksbilden baserat pÄ innehÄllet i WAL.
NÀr en klient lÀgger till en nyckel i nyckel-vÀrde-lagringen eller uppdaterar vÀrdet av en befintlig nyckel, gör etcd en post om denna operation i WAL, vilket Àr en vanlig fil i det permanenta lagringsutrymmet. Innan etcd fortsÀtter behandlingen Mà STE det vara helt sÀkert pÄ att posten i WAL verkligen har gjorts. I Linux rÀcker det inte med ett enda systemanrop. , eftersom sjÀlva skrivningen till det fysiska lagringsutrymmet kan fördröjas. Till exempel kan Linux hÄlla posten i WAL i minnescache (som sidcache) en tid. För att sÀkerstÀlla att data skrivs till det permanenta lagringsutrymmet krÀvs ett systemanrop fdatasync efter skrivningen, och etcd anvÀnder precis det (som kan ses i resultatet av , dÀr 8 Àr filbeskrivaren för 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) = 0TyvÀrr sker skrivningen till det permanenta lagringsutrymmet inte omedelbart. Om fdatasync-anropet gÄr lÄngsamt sÀnks prestandan för etcd-systemet. , att lagringen anses vara tillrÀckligt snabb om 99:e percentiler av fdatasync-anrop vid skrivning till WAL-filen tar mindre Àn 10 ms. Det finns Àven andra anvÀndbara metrikar för lagringen, men i det hÀr inlÀgget pratar vi endast om denna metrik.
UtvÀrdering av lagringen med hjÀlp av fio
Om du behöver bedöma om ditt lagringsutrymme Ă€r lĂ€mpligt för etcd, anvĂ€nd fio â ett mycket populĂ€rt verktyg för att testa insignal- och utsignalbelastningar. Det Ă€r viktigt att komma ihĂ„g att diskoperationer kan vara av mĂ„nga olika slag: synkrona och asynkrona, ett flertal klasser av systemanrop osv. Som en följd av detta Ă€r fio ganska svĂ„rt att anvĂ€nda. Det har mĂ„nga parametrar, och olika kombinationer av dessa vĂ€rden ger helt olika insignal- och utsignalbelastningar. För att fĂ„ adekvata siffror för etcd bör du sĂ€kerstĂ€lla att testbelastningen för skrivning frĂ„n fio ligger sĂ„ nĂ€ra den verkliga belastningen frĂ„n etcd vid skrivning av WAL-filer som möjligt.
DĂ€rför bör fio Ă„tminstone skapa en belastning av en sekvens av sekventiella skrivoperationer till en fil, dĂ€r varje skrivning kommer att bestĂ„ av ett systemanrop , följt av systemanropet fdatasync. För sekventiella skrivoperationer behöver fio parametern ârw=write. För att fio ska anvĂ€nda systemanropet write vid skrivning, istĂ€llet för , bör du ange parametern âioengine=sync. Slutligen, för att fdatasync ska kallas efter varje skrivning, mĂ„ste du lĂ€gga till parametern âfdatasync=1. De tvĂ„ andra parametrarna i det hĂ€r exemplet (âsize och âbs) beror pĂ„ det specifika scenariot. I nĂ€sta avsnitt kommer vi att förklara hur du konfigurerar dem.
Varför just fio och hur vi lÀrde oss att konfigurera det
I det hÀr inlÀgget beskriver vi ett verkligt fall. Vi hade en kluster v1.13, som vi övervakade med Prometheus. etcd v3.2.24 var placerad pÄ SSD. Metrikerna för etcd visade för höga latenser för fdatasync, Àven nÀr klustret inte gjorde nÄgot. Metrikerna var underliga, och vi visste inte riktigt vad de betydde. Klustret bestod av virtuella maskiner, och vi behövde förstÄ vad problemet var: i de fysiska SSD:erna eller i virtualiseringslagret. Dessutom gjorde vi ofta Àndringar i hÄrdvaru- och mjukvarukonfigurationen, och vi behövde ett sÀtt att utvÀrdera deras resultat. Vi kunde köra etcd i varje konfiguration och titta pÄ Prometheus-metrikerna, men det var för krÄngligt. Vi sökte efter ett tillrÀckligt enkelt sÀtt att utvÀrdera en specifik konfiguration. Vi ville kontrollera om vi förstod Prometheus-metrikerna för etcd korrekt.
Men för att göra detta behövde vi lösa tvĂ„ problem. För det första, hur ser I/O-belastningen ut som etcd skapar vid skrivning till WAL? Vilka systemanrop anvĂ€nds? Vad Ă€r storleken pĂ„ posterna? För det andra, om vi svarar pĂ„ dessa frĂ„gor, hur kan vi Ă„terskapa en liknande arbetsbelastning med fio? TĂ€nk pĂ„ att fio Ă€r ett mycket flexibelt verktyg med mĂ„nga parametrar. Vi löste bĂ„da problemen med en metod â med hjĂ€lp av kommandon. och . lsof visar alla filbeskrivare som anvĂ€nds av processen samt de filer som Ă€r kopplade till dem. Med strace kan vi analysera en redan körande process eller starta en process och studera den. strace skriver ut alla systemanrop frĂ„n den studerade processen (och dess barnprocesser). Det senare Ă€r mycket viktigt, eftersom etcd anvĂ€nder just denna metod.
Först anvĂ€nde vi strace för att studera etcd-servern för Kubernetes nĂ€r klustret inte hade belastning. Vi sĂ„g att nĂ€stan alla WAL-poster var ungefĂ€r samma storlek: 2200â2400 byte. DĂ€rför angav vi i kommandot i början av inlĂ€gget parametern âbs=2300 (bs betyder storlek i byte för varje fio-post). Observera att storleken pĂ„ posterna i etcd beror pĂ„ versionen av etcd, distributionen, parameterinstĂ€llningarna osv. och pĂ„verkar varaktigheten av fdatasync. Om du har ett liknande scenario, studera dina etcd-processer med hjĂ€lp av strace för att fĂ„ exakta siffror.
Sedan, för att fÄ en bra uppfattning om aktiviteterna i filsystemet för etcd, körde vi den med strace och parametrarna -ffttT. PÄ sÄ sÀtt försökte vi analysera barnprocesserna och skriva utdata frÄn var och en av dem till en separat fil, samt fÄ detaljerade rapporter om början och varaktigheten av varje systemanrop. Vi anvÀnde lsof för att bekrÀfta vÄr analys av strace-data och se vilken filbeskrivare som anvÀndes för vilka syften. SÄ, med hjÀlp av strace, fick vi de resultat som visas ovan. Statistik över synkroniseringstiden bekrÀftade att wal_fsync_duration_seconds frÄn etcd motsvarar anropen till fdatasync med filbeskrivare frÄn WAL.
Vi studerade dokumentationen för fio och valde parametrar för vÄrt scenario sÄ att fio skulle generera en belastning som liknar den för etcd. Vi kontrollerade Àven systemanropen och deras varaktighet genom att köra fio frÄn strace, pÄ samma sÀtt som med etcd.
Vi har noggrant valt betydelsen av parametern âsize, som representerar hela belastningen av in- och utdata frĂ„n fio. I vĂ„rt fall Ă€r detta det totala antalet byte som skrivs till lagring. Det visade sig vara direkt proportionellt mot antalet systemanrop write (och fdatasync). För ett visst vĂ€rde av bs Ă€r antalet fdatasync-anrop = size/bs. Eftersom vi var intresserade av percentiler, behövde vi tillrĂ€ckligt med prov för tillförlitlighet, och vi berĂ€knade att 10^4 skulle vara tillrĂ€ckligt (det blir 22 mebibyte). Om âsize Ă€r mindre kan det uppstĂ„ utstickare (till exempel kan flera fdatasync-anrop ta lĂ€ngre tid Ă€n normalt och pĂ„verka den 99:e percentilen).
Prova sjÀlv
Vi har visat hur man anvÀnder fio och hur man avgör om lagringen har tillrÀcklig hastighet för hög prestanda i etcd. Nu kan du pröva det i praktiken sjÀlv, till exempel med virtuella maskiner med SSD-lagring i .
KĂ€lla: habr.com
