Obs. övers.: Denna artikel sammanfattar en mini-studie utförd av IBM Cloud-ingenjörer för att hitta en lösning pÄ ett verkligt problem kopplat till drift av databasen etcd. Vi hade en liknande uppgift, men författarnas tankegÄngar och ÄtgÀrder kan vara intressanta i ett bredare sammanhang.

Sammanfattning av hela artikeln: fio och etcd
Prestandan hos etcd-klustret beror starkt pĂ„ hastigheten hos den underliggande lagringen. För att övervaka prestandan exporterar etcd olika Prometheus-metrik. En av dessa Ă€r wal_fsync_duration_seconds. I dokumentationen för etcd , anses lagringen vara tillrĂ€ckligt snabb om den 99:e percentilen för denna metrik inte överstiger 10 msâŠ
Om du övervÀger att sÀtta upp ett etcd-kluster pÄ maskiner som kör Linux och vill kontrollera om dina lagringsenheter (till exempel SSD) Àr tillrÀckligt snabba, rekommenderar vi att du anvÀnder den populÀra I/O-testaren . Du behöver bara köra följande kommando (katalogen test-data ska ligga i den monterade partitionen av den testade lagringsenheten):
fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytestDu behöver bara titta pÄ utdata och kontrollera om den 99:e percentilen Àr inom 10 ms. Om sÄ Àr fallet, fungerar din lagringsenhet tillrÀckligt snabbt. HÀr Àr ett exempel pÄ utdata:
fsync/fdatasync/sync_file_range:
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]NÄgra kommentarer:
- I exemplet ovan anpassade vi parametrarna
--sizeoch--bstill det specifika fallet. För att fÄ meningsfulla resultat frÄnfio, ange vÀrden som Àr lÀmpliga för ditt anvÀndningsscenario. Hur man vÀljer dem kommer att förklaras nedan. - Under testningen Àr det endast
fiosom belastar lagringssystemet. I verkliga livet Àr det mycket troligt att andra processer ocksÄ skriver till disken (förutom de relaterade tillwal_fsync_duration_seconds). En sÄdan extra belastning kan leda till en ökning avwal_fsync_duration_seconds. Med andra ord, om den 99:e percentilen som erhÄllits vid testningen medfio, bara ligger nÄgot under 10 ms, Àr det stor sannolikhet att lagringens prestanda Àr otillrÀcklig. - För testet behöver du versionen
fiointe lÀgre Àn 3.5, eftersom Àldre versioner inte aggregerar resultatenfdatasynci form av percentiler. - Den ovan angivna utdata Àr bara ett litet utdrag frÄn den totala utdata.
fio.
Mer om fio och etcd.
NÄgra ord om WAL:ar i etcd.
Som regel anvÀnder databaser (write-ahead logging, WAL). Detta gÀller Àven etcd. Diskussionen om WAL ligger utanför denna artikel, men för vÄra syften behöver vi veta följande: varje medlem i etcd-klustret lagrar WAL i en permanent lagringslösning. etcd skriver vissa operationer med nyckel-vÀrde-lagret (t.ex. uppdateringar) i WAL innan de genomförs. Om en nod kraschar och startas om mellan snapshots, kan etcd ÄterstÀlla transaktionerna som genomfördes frÄn den föregÄende snapshoten, baserat pÄ innehÄllet i WAL.
SĂ„ varje gĂ„ng en klient lĂ€gger till en nyckel i KV-lagret eller uppdaterar vĂ€rdet av en befintlig nyckel, lĂ€gger etcd till en beskrivning av operationen i WAL, som Ă€r en vanlig fil i permanent lagring. Innan den fortsĂ€tter sitt arbete MĂ
STE etcd vara 100% sĂ€ker pĂ„ att inspelningen i WAL verkligen Ă€r sparad. För att uppnĂ„ detta i Linux rĂ€cker det inte med att anvĂ€nda systemanropet , eftersom sjĂ€lva skrivoperationen pĂ„ den fysiska enheten kan fördröjas. Till exempel kan Linux under en tid hĂ„lla WAL-inspelningen i kĂ€rnans cache i minnet (t.ex. i sidcache). För att sĂ€kerstĂ€lla att data skrivs till enheten, mĂ„ste ett systemanrop genomföras efter skrivning fdatasync â det Ă€r vad etcd gör (som man kan se i nĂ€sta utdrag ; hĂ€r 8 â WAL-fildeskriptor):
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 TyvÀrr tar det lite tid att skriva till permanent lagring. LÄngvariga fdatasync-anrop kan pÄverka prestandan för etcd. I dokumentationen för lagringen nÀmns , att för tillrÀcklig prestanda bör den 99:e percentilen av varaktigheten för alla anrop fdatasync vid skrivning till WAL-filen vara mindre Àn 10 ms. Det finns andra mÄtt relaterade till lagringen, men denna artikel fokuserar just pÄ detta.
UtvÀrderar lagringen med fio.
Om ett visst lagringsalternativ Ă€r lĂ€mpligt för anvĂ€ndning med etcd kan bedömas med hjĂ€lp av verktyget â populĂ€r testare av I/O. TĂ€nk pĂ„ att disk I/O kan ske pĂ„ olika sĂ€tt: sync/async, ett flertal olika klasser av systemanrop osv. Den baksidan Ă€r att fio den Ă€r extremt svĂ„r att anvĂ€nda. Verktyget har mĂ„nga parametrar, och olika kombinationer av deras vĂ€rden ger helt olika resultat. För att fĂ„ en rimlig bedömning nĂ€r det gĂ€ller etcd mĂ„ste du se till att skrivbelastningen som genereras av fio mest liknar den belastning etcd hanterar vid skrivning till WAL-filer:
- Detta innebÀr att den genererade
fiobelastningen minst mÄste representera en serie sekventiella skrivningar till en fil, dÀr varje skrivoperation bestÄr av ett systemanrop , följt avfdatasync. - För att aktivera sekventiell skrivning mÄste du ange flaggan
--rw=write. - För att
fiosom skrevs med hjĂ€lp av anropskriv(inte andra systemanrop â till exempel, ), anvĂ€nd flaggan--ioengine=sync. - Slutligen, flaggan
--fdatasync=1garanterar att varjeskrivmanfdatasync. - De tvÄ andra parametrarna i vÄrt exempel:
--sizeoch--bsâ kan Ă€ndras beroende pĂ„ det specifika anvĂ€ndningsfallet. Deras konfiguration kommer att beskrivas i nĂ€sta avsnitt.
Varför vi valde fio och hur vi lÀrde oss att konfigurera det
Denna anteckning kom frÄn en verklig situation vi stötte pÄ. Vi hade en kluster pÄ Kubernetes v1.13 med övervakning pÄ Prometheus. Förlagring för etcd v3.2.24 var SSD-enheter. Metrikarna frÄn etcd visade för höga latenser fdatasync, Àven nÀr klustret var inaktivt. Vi tyckte att dessa metrikar verkade mycket tvivelaktiga, och vi var osÀkra pÄ vad de egentligen representerade. Dessutom bestod klustret av virtuella maskiner, sÄ vi kunde inte sÀga om latensen berodde pÄ virtualisering eller om SSD:erna var den verkliga syndaren.
Vi övervÀgde dessutom olika förÀndringar i maskin- och programvarukonfigurationen, sÄ vi behövde ett sÀtt att utvÀrdera dem. SjÀlvklart kunde man ha kört etcd i varje konfiguration och tittat pÄ de motsvarande metrikarna frÄn Prometheus, men det skulle krÀva betydande insatser. Vi behövde ett enkelt sÀtt att kunna bedöma en specifik konfiguration. Vi ville kontrollera vÄr förstÄelse av de metrikar frÄn Prometheus som kom frÄn etcd.
För detta behövde vi lösa tvÄ problem:
- För det första, hur ser I/O-belastningen ut som genereras av etcd vid skrivning till WAL-filer? Vilka systemanrop anvÀnds? Vad Àr storleken pÄ skrivblocken?
- För det andra, anta att vi har svar pÄ ovanstÄende frÄgor. Hur kan vi reproducera motsvarande belastning med
fio? ĐДЎŃfioâ ett extremt flexibelt verktyg med mĂ„nga alternativ (detta kan lĂ€tt verifieras, till exempel, Ââ anm. övers.).
Vi löste bÄda problemen med samma angreppssÀtt, baserat pÄ kommandon och :
- Med hjÀlp av
lsofman kan visa alla filbeskrivare som anvÀnds av processen, samt de filer som de hÀnvisar till. - Med hjÀlp av
för att kontrollera paketöverföringen Ät bÄda hÄllman kan analysera en redan körande process eller starta en process och observera den. Kommandot visar alla systemanrop som gjorts av denna process och, vid behov, dess avkommor. Det hÀr Àr viktigt för processer som forkas, och etcd Àr en sÄdan process.
Det första vi gjorde var att anvÀnda för att kontrollera paketöverföringen Ät bÄda hÄll för att studera etcd-servern i Kubernetes-klustret medan den var inaktiv.
Det upptĂ€cktes att skrivblocken i WAL var mycket tĂ€tt grupperade, majoriteten lĂ„g inom spannet 2200-2400 byte. Det Ă€r dĂ€rför flaggan --bs=2300 (bs â storleken i byte pĂ„ varje skrivblock i fio).
Observera att storleken pĂ„ skrivblocken i etcd kan variera beroende pĂ„ version, deployment, parameterinstĂ€llningar och sĂ„ vidare â detta pĂ„verkar varaktigheten. fdatasync. Om du har ett liknande anvĂ€ndarscenario, analysera för att kontrollera paketöverföringen Ă„t bĂ„da hĂ„ll dina etcd-processer för att fĂ„ aktuella vĂ€rden.
Sedan, för att fÄ en tydlig och heltÀckande bild av hur etcd arbetar med filsystemet, körde vi det med för att kontrollera paketöverföringen Ät bÄda hÄll med flaggorna -ffttT. Detta gjorde det möjligt att tÀcka avkommande processer och skriva utdata av varje i en separat fil. Dessutom fick vi detaljerad information om nÀr varje systemanrop startade och hur lÀnge de varade.
Vi anvÀnde ocksÄ kommandot lsof, för att bekrÀfta vÄr förstÄelse av utskriften för att kontrollera paketöverföringen Ät bÄda hÄll nÀr det gÀller vilken filbeskrivare som anvÀndes för vilket syfte. Utskriften blev för att kontrollera paketöverföringen Ät bÄda hÄll, liknande den som ges ovan. Statistiska manipulationer av synkroniseringstider bekrÀftade att mÀtningen wal_fsync_duration_seconds frÄn etcd motsvarar anropen fdatasync med filbeskrivare för WAL-filer.
För att generera med hjÀlp av fio Arbetsbelastningen, som liknar belastningen frÄn etcd, granskades i dokumentationen för verktyget och parametrarna anpassades till vÄr uppgift. Vi bekrÀftade att de nödvÀndiga systemanropen anvÀndes och verifierade deras varaktighet genom att köra fio frÄn för att kontrollera paketöverföringen Ät bÄda hÄll (pÄ samma sÀtt som det gjordes för etcd).
SÀrskild uppmÀrksamhet Àgnades Ät att bestÀmma vÀrdet av parametern --size. Det representerar den totala I/O-belastningen som genereras av verktyget fio. I vÄrt fall Àr det det totala antalet byte som skrivs till enheten. Det Àr direkt proportionellt mot antalet anrop skriv (och fdatasync). För ett visst bs antal anrop fdatasync Àr lika med size / bs.
Eftersom vi var intresserade av percentilen strÀvade vi efter att antalet prov skulle vara tillrÀckligt stort för statistisk signifikans. Vi beslutade att 10^4 (vilket motsvarar en storlek pÄ 22 MB) skulle vara tillrÀckligt. Mindre vÀrden pÄ parametern --size gav mer uttalad brus (till exempel anrop fdatasync, som tar mycket mer tid Àn vanligt och pÄverkar 99:e percentilen).
Nu Àr det upp till er
Artikeln visar hur man med hjÀlp av fio kan bedöma om en enhet som Àr avsedd för anvÀndning med etcd Àr tillrÀckligt snabb. Nu Àr det upp till er! Ni kan utforska virtuella maskiner med SSD-baserad lagring i tjÀnsten .
P.S. frÄn översÀttaren
Med fÀrdiga exempel pÄ anvÀndning fio för att lösa andra uppgifter kan ni bekanta er med eller direkt i (dÀr det finns mÄnga fler Àn som nÀmns i dokumentationen).
P.P.S. frÄn översÀttaren
LÀs Àven i vÄr blogg:
- «»;
- «»;
- «».
KĂ€lla: habr.com
