Leza hilanînê ji bo etcd maqûl e? Ka em ji fio bipirsin

Leza hilanînê ji bo etcd maqûl e? Ka em ji fio bipirsin

Kurteçîrokek li ser fio û hwd

Performansa Cluster etcd bi piranî bi performansa hilanîna wê ve girêdayî ye. etcd hin metrîkan hinarde dike Prometheusda ku agahdariya performansa hilanînê ya xwestî peyda bike. Mînakî, metrika wal_fsync_duration_seconds. Belge ji bo etcd dibêje: Ji bo ku hilanîn bi têra xwe bilez were hesibandin, divê sedî 99-an a vê metrikê ji 10ms kêmtir be. Ger hûn plan dikin ku komek etcd li ser makîneyên Linux-ê bimeşînin û dixwazin binirxînin ka hilanîna we têra xwe zû ye (mînak SSD), hûn dikarin bikar bînin fio ji bo ceribandina operasyonên I/O amûrek populer e. Fermana jêrîn bimeşînin, li cihê ku daneya testê pelrêça di binê xala hilanînê de ye:

fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytest

Hûn tenê hewce ne ku li encaman mêze bikin û kontrol bikin ku ji sedî 99-ê ya dirêjbûnê ye fdatasync kêmtir ji 10 ms. Ger wusa be, we depoya bilez a maqûl heye. Li vir mînakek encaman e:

  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]

Notes

  • Me vebijarkên --size û --bs ji bo senaryoya xweya taybetî xweş kirine. Ji bo ku ji fio encamek kêrhatî bistînin, nirxên xwe peyda bikin. Li ku derê wan bistînin? Xwendin em çawa fêrî mîhengkirina fio bûn.
  • Di dema ceribandinê de, hemî barkirina I/O ji fio tê. Di senaryoyek jiyanî ya rast de, ji bilî yên ku bi wal_fsync_duration_seconds ve girêdayî ne, dibe ku daxwazên nivîsandinê yên din jî werin hilanînê. Barkirina zêde dê nirxa wal_fsync_duration_seconds zêde bike. Ji ber vê yekê heke ji sedî 99-an nêzî 10ms be, hilanîna we ji leza xwe diqede.
  • Guhertoyê bistînin fio ne kêmtir ji 3.5 (Yên berê ji sedî dirêjahiya fdatasync nîşan nadin).
  • Li jor tenê pişkek ji encamên fio ye.

Çîrokek dirêj li ser fio û hwd

WAL di etcd de çi ye

Bi gelemperî databases bikar tînin têketina pêş-nivîsandinê; etcd jî bikar tîne. Em ê li vir bi hûrgulî li ser têketina pêş-nivîsandinê (WAL) nîqaş nekin. Tenê pêdivî ye ku em zanibin ku her endamek koma etcd wê di hilanîna domdar de diparêze. etcd berî ku wê li firotgehê bicîh bike, her operasyona nirx-kilît (wek nûvekirin) li WAL dinivîse. Ger yek ji endamên hilanînê di navbera wêneyan de têk bibe û ji nû ve dest pê bike, ew dikare ji wêneya paşîn a ji hêla naveroka WAL-ê ve veguheztina herêmî vegerîne.

Gava ku xerîdar mifteyek li dikana nirx-kilît zêde dike an nirxa mifteyek heyî nûve dike, etcd operasyona li WAL-ê tomar dike, ku pelek birêkûpêk e di hilanîna domdar de. etcd DIVÊ bi tevahî pê ewle be ku têketina WAL bi rastî beriya ku pêvajoyê bidomîne pêk hatiye. Li Linux-ê, yek bangek pergalê ji bo vê têrê nake. nivîsîn, ji ber ku nivîsandina rastîn a hilanîna laşî dibe ku dereng bimîne. Mînakî, Linux dikare navnîşek WAL-ê di cache-ya bîranîna kernel de (wek cache rûpel) ji bo demekê hilîne. Û ji bo ku dane bi rasthatinî li hilanîna domdar bêne nivîsandin, piştî nivîsandinê banga pergala fdatasync hewce ye, û etcd tenê wê bikar tîne (wek ku hûn di encama xebatê de dibînin strace, ku 8 ravekera pelê WAL e):

21:23:09.894875 lseek(8, 0, SEEK_CUR)   = 12808 <0.000012>
21:23:09.894911 write(8, ". 20210220361223255266632$10 20103026"34"rn3fo"..., 2296) = 2296 <0.000130>
21:23:09.895041 fdatasync(8)            = 0 <0.008314>

Mixabin, nivîsandina li hilanîna domdar tavilê çênabe. Ger banga fdatasync hêdî be, performansa pergala etcd dê zirarê bibîne. Belge ji bo etcd dibêjeku hilanîn bi têra xwe zû tête hesibandin heke, di sedî 99-an de, bangên fdatasync kêmtirî 10ms digire ku li pelê WAL binivîse. Metrîkên din ên kêrhatî ji bo hilanînê hene, lê di vê postê de em tenê li ser vê metrikê diaxivin.

Texmînkirina hilanînê bi fio

Heke hûn hewce ne ku binirxînin ka hilanîna we ji bo etcd-ê maqûl e, fio, amûrek ceribandina barkirina I/O-ya pir populer bikar bînin. Divê ji bîr mekin ku karûbarên dîskê dikarin pir cûda bin: hevdem û asînkron, gelek çînên bangên pergalê, hwd. Wekî encamek, karanîna fio pir dijwar e. Ew gelek parametre hene, û berhevokên cûda yên nirxên wan bargiraniyên I/O yên pir cihêreng hilberînin. Ji bo ku hûn ji bo etcd hejmarên têr bistînin, divê hûn pê ewle bin ku dema nivîsandina pelên WAL-ê barkirina nivîsandina testê ya ji fio bi qasî ku pêkan nêzîkê barkirina rastîn a etcd ye.

Ji ber vê yekê, divê fio, bi kêmanî, barek di forma rêzek nivîsên li pey hev de li pelê biafirîne, her nivîsandin dê ji bangek pergalê pêk were. nivîsînli pey banga sîstema fdatasync. Ji bo nivîsandina rêzikan ji bo fio vebijarka --rw=write hewce dike. Ji bo ku fio dema nivîsandinê bangî pergala nivîsandinê bike, ji bilî nivîsîn, divê hûn pîvana --ioengine=sync diyar bikin. Di dawiyê de, ji bo ku hûn piştî her nivîsandinê gazî fdatasync bikin, divê hûn pîvana --fdatasync=1 lê zêde bikin. Di vê nimûneyê de du vebijarkên din (--size û -bs) taybetmendî skrîptê ne. Di beşa pêş de, em ê nîşanî we bidin ka meriv çawa wan saz dike.

Çima tam fio û em çawa fêr bûn ku wê saz bikin

Di vê postê de, em bûyerek rastîn diyar dikin. Komek me heye Kubernetes v1.13 ya ku me bi Prometheus re şopand. etcd v3.2.24 li ser SSD-ê hate mêvandar kirin. Metrîkên Etcd derengiyên fdatasync pir zêde nîşan didin, tewra dema ku kom tiştek nedikir. Metrîk xerîb bûn û me bi rastî nizanibû ku wateya wan çi ye. Kom ji makîneyên virtual pêk dihat, pêdivî bû ku meriv fêm bike ka pirsgirêk çi ye: di SSD-yên laşî de an di qata virtualbûnê de. Wekî din, me pir caran di veavakirina hardware û nermalavê de guhertin çêkir, û ji me re rêyek hewce bû ku em encamên wan binirxînin. Em dikaribûn di her veavakirinê de etcd bimeşînin û li metrîkên Prometheus binihêrin, lê ew pir tengasiyek e. Em ji bo nirxandina veavakirinek taybetî li rêyek pir hêsan digeriyan. Me xwest em kontrol bikin ka em metrîka Prometheus ji etcd rast fam dikin.

Lê ji bo vê yekê diviyabû du pirsgirêk bên çareserkirin. Pêşîn, barkirina I/O ya ku etcd diafirîne dema ku ji WAL re dinivîse çawa xuya dike? Çi bangên pergalê têne bikaranîn? Mezinahiya qeydan çi ye? Ya duyemîn, heke em bersiva van pirsan bidin, em ê çawa bi fio re karekî wekhev dubare bikin? Ji bîr nekin ku fio bi gelek vebijarkan amûrek pir maqûl e. Me her du pirsgirêk di yek nêzîkbûnê de çareser kirin - bi karanîna fermanan lsof и strace. lsof hemî ravekerên pelan ên ku ji hêla pêvajoyê ve têne bikar anîn û pelên wan ên têkildar navnîş dike. Û bi strace, hûn dikarin pêvajoyek jixwe dimeşîne lêkolîn bikin, an pêvajoyek dest pê bikin û wê lêkolîn bikin. strace hemî bangên pergalê ji pêvajoya ku tê vekolîn (û pêvajoyên wê yên zarok) çap dike. Ya paşîn pir girîng e, ji ber ku etcd tenê nêzîkatiyek wekhev digire.

Me yekem car strace bikar anî da ku servera etcd ji bo Kubernetes keşif bike dema ku barek li ser komê tune bû. Me dît ku hema hema hemî tomarên WAL bi heman mezinahiyê bûn: 2200–2400 bytes. Ji ber vê yekê, di fermana destpêka postê de, me parametreya -bs=2300 diyar kir (bs tê wateya mezinahiya bi bîtan ji bo her têketina fio). Bala xwe bidinê ku mezinahiya têketina etcd bi guhertoya etcd, belavkirin, nirxên parametreyê, hwd ve girêdayî ye, û dê bandorê li dirêjahiya fdatasync bike. Ger senaryoyek weya wekhev hebe, pêvajoyên etcd-ya xwe bi rêgezê bikolin da ku hejmarên rastîn bibînin.

Dûv re, ji bo ku em ramanek baş bibînin ka pergala pelê etcd çi dike, me ew bi strace û vebijarkên -ffttT dest pê kir. Ji ber vê yekê me hewl da ku em pêvajoyên zarokê lêkolîn bikin û hilberîna her yek ji wan di pelek cûda de tomar bikin, û di heman demê de raporên hûrgulî di derbarê destpêk û dirêjahiya her bangek pergalê de jî bistînin. Me lsof bikar anî da ku analîza xwe ya der barê derana straceyê piştrast bike û bibîne ka kîjan ravekera pelê ji bo kîjan armancê hatî bikar anîn. Ji ber vê yekê bi alîkariya strace, encamên ku li jor hatine destnîşan kirin hatin bidestxistin. Statîstîkên dema hevdengkirinê piştrast kir ku wal_fsync_duration_seconds ji etcd bi bangên fdatasync ên bi ravekerên pelê WAL re hevaheng e.

Me belgeyên ji bo fio derbas kir û vebijarkên ji bo nivîsara xwe hilbijart da ku fio barek mîna etcd çêbike. Di heman demê de me bangên pergalê û dirêjahiya wan jî bi xebitandina fio ji strace, mîna etcd, kontrol kir.

Me bi baldarî nirxa pîvana --size hilbijartiye da ku tevahiya barkirina I/O ji fioyê temsîl bike. Di rewşa me de, ev hejmara giştî ya baytên ku li hilanînê hatine nivîsandin e. Derket holê ku rasterast bi hejmara bangên pergala nivîsandinê (û fdatasync) re têkildar e. Ji bo nirxek diyar a bs, hejmara bangên fdatasync = mezinahî/bs. Ji ber ku em bi sedî eleqedar bûn, ji bo ku em pê ewle bin diviyabû ku em têra nimûneyan hebin, û me hesab kir ku 10^4 dê ji me re têrê bike (ew 22 mebibyte). Ger --size piçûktir be, dibe ku derbirîn çêbibin (mînak, çend bangên fdatasync ji gelemperî dirêjtir digirin û bandorê li sedî 99-an dikin).

Xwe biceribînin

Me nîşanî we da ku meriv çawa fio bikar tîne û bibînin ka hilanînê ew qas zû ye ku etcd baş bixebite. Naha hûn dikarin wê ji bo xwe biceribînin, mînakî, makîneyên virtual yên ku tê de hilanînê SSD hene Cloud IBM.

Source: www.habr.com

Add a comment