Hur man med fio kontrollerar att diskarna har tillrÀcklig prestanda för etcd

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.

Hur man med fio kontrollerar att diskarna har tillrÀcklig prestanda för etcd

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 sĂ€ger, 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 fio. 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=mytest

Du behöver bara titta pÄ utdata och kontrollera om den 99:e percentilen fdatasync À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:

  1. I exemplet ovan anpassade vi parametrarna --size och --bs till det specifika fallet. För att fÄ meningsfulla resultat frÄn fio, ange vÀrden som Àr lÀmpliga för ditt anvÀndningsscenario. Hur man vÀljer dem kommer att förklaras nedan.
  2. Under testningen Àr det endast fio som belastar lagringssystemet. I verkliga livet Àr det mycket troligt att andra processer ocksÄ skriver till disken (förutom de relaterade till wal_fsync_duration_seconds). En sÄdan extra belastning kan leda till en ökning av wal_fsync_duration_seconds. Med andra ord, om den 99:e percentilen som erhÄllits vid testningen med fio, bara ligger nÄgot under 10 ms, Àr det stor sannolikhet att lagringens prestanda Àr otillrÀcklig.
  3. För testet behöver du versionen fio inte lÀgre Àn 3.5, eftersom Àldre versioner inte aggregerar resultaten fdatasync i form av percentiler.
  4. 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 förhandsloggning (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 skriv, 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 för att kontrollera paketöverföringen Ă„t bĂ„da hĂ„ll; 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 anges, 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 fio — 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 fio belastningen minst mĂ„ste representera en serie sekventiella skrivningar till en fil, dĂ€r varje skrivoperation bestĂ„r av ett systemanrop skriv, följt av fdatasync.
  • För att aktivera sekventiell skrivning mĂ„ste du ange flaggan --rw=write.
  • För att fio som skrevs med hjĂ€lp av anrop skriv (inte andra systemanrop — till exempel, pwrite), anvĂ€nd flaggan --ioengine=sync.
  • Slutligen, flaggan --fdatasync=1 garanterar att varje skriv man fdatasync.
  • De tvĂ„ andra parametrarna i vĂ„rt exempel: --size och --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, hĂ€r ­— anm. övers.).

Vi löste bÄda problemen med samma angreppssÀtt, baserat pÄ kommandon lsof och för att kontrollera paketöverföringen Ät bÄda hÄll:

  • Med hjĂ€lp av lsof man 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Ă„ll man 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 IBM Cloud.

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 dokumentationen eller direkt i projektets repository (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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster