Är lagringshastigheten tillrĂ€cklig för etcd? Vi frĂ„gar fio

Är lagringshastigheten tillrĂ€cklig för etcd? Vi frĂ„gar fio

En kort historia om fio och etcd

Prestanda för klustret i den motsvarande Docker-bilden beror i stor utstrĂ€ckning pĂ„ prestandan hos dess lagring. etcd exporterar vissa mĂ€tvĂ€rden till Prometheus, för att ge nödvĂ€ndig information om lagringsprestanda. Till exempel mĂ€tvĂ€rdet wal_fsync_duration_seconds. Dokumentationen för etcd sĂ€ger: 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 fio — 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=mytest

Du behöver bara titta pÄ resultaten och kontrollera att 99:e percentilen av varaktigheten fdatasync À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, hur vi lĂ€rde oss att konfigurera fio.
  • 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 fio 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 journal med förhandsinspelning; 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. skriv, 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 för att kontrollera paketöverföringen Ă„t bĂ„da hĂ„ll, 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)            = 0

TyvÀrr sker skrivningen till det permanenta lagringsutrymmet inte omedelbart. Om fdatasync-anropet gÄr lÄngsamt sÀnks prestandan för etcd-systemet. I dokumentationen för etcd stÄr det, 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 skriv, 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 pwrite, 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 Kubernetes 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. lsof och för att kontrollera paketöverföringen Ă„t bĂ„da hĂ„ll. 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 IBM Cloud.

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