Meriv çawa dîskên bi fio-yê ji bo performansa têr ji bo etcd kontrol dike

Not. werger.: Ev gotar encamên piçûk-lêkolînek e ku ji hêla endezyarên IBM Cloud ve hatî çêkirin di lêgerîna çareseriyek pirsgirêkek rastîn a têkildarî xebata databasa etcd de ye. Karekî bi vî rengî ji bo me jî têkildar bû, lê dibe ku di çarçoveyek berfireh de rêça fikir û tevgerên nivîskaran balkêş be.

Meriv çawa dîskên bi fio-yê ji bo performansa têr ji bo etcd kontrol dike

Kurteya tevaya gotarê: fio û hwd

Performansa komek etcd pir bi leza hilanîna bingehîn ve girêdayî ye. Ji bo şopandina performansê, etcd metrîkên Prometheus yên cihêreng hinarde dike. Yek ji wan e wal_fsync_duration_seconds. Di belgeyên etcd de ew dibêje, ew hilanîn dikare têra xwe zû were hesibandin heke ji sedî 99-ê vê metrikê ji 10 ms derbas nebe ...

Eger hûn difikirin ku komeke etcd li ser makîneyên ku dixebitin saz bikin Linux û dixwazin kontrol bikin ka cîhazên we yên hilanînê (wek SSD) têra xwe bilez in, em pêşniyar dikin ku hûn amûrek ceribandina I/O ya populer a bi navê bikar bînin. fio. Tenê emrê jêrîn bimeşînin (rêveber test-data Pêdivî ye ku di dabeşkirina siwarkirî ya ajokara ku tê ceribandin de cih bigire):

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

Tiştê ku dimîne ev e ku meriv li encam mêze bike û kontrol bike ka ew bi sedî 99-an re têkildar e fdatasync di 10 ms. Ger wusa be, wê hingê ajokera we têra xwe bilez e. Li vir encamek nimûne ye:

fsync/fdatasync/sync_file_range:
  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]

Çend not:

  1. Di mînaka jorîn de me pîvan eyar kirine --size и --bs ji bo dozek taybetî. Ji bo bidestxistina encamên watedar ji fio, nirxên ku ji bo doza karanîna we guncan in diyar bikin. Meriv çawa wan hilbijêrin dê li jêr were nîqaş kirin.
  2. Di dema ceribandinê de tenê fio binpergala dîskê bar dike. Di jiyana rast de, îhtîmal e ku pêvajoyên din (ji bilî yên ku bi wan re têkildar in wal_fsync_duration_seconds). Barek wusa zêde dikare bibe sedema zêdebûnê wal_fsync_duration_seconds. Bi gotinek din, heke ji sedî 99-an ji ceribandina bi fio, tenê hinekî kêmtir ji 10 ms, şansek baş heye ku performansa hilanînê têrê nake.
  3. Ji bo ceribandinê hûn ê guhertoyê hewce bikin fio ne kêmtir ji 3.5, ji ber ku guhertoyên kevintir encaman berhev nakin fdatasync di forma ji sedî.
  4. Encama jorîn tenê perçeyek piçûk a encama giştî ye fio.

Agahiyên li ser fio û hwd

Çend gotin li ser WALs hwd

Bi gelemperî, databases bikar tînin têketina proaktîf (têketin-pêş-nivîsandin, WAL). etcd ev jî derbas dibe. Nîqaşek li ser WAL ji çarçoweya vê gotarê wêdetir e, lê ji bo mebestên me li vir tiştê ku hûn hewce ne ku zanibin ev e: Her endamek koma etcd WAL-ê di hilanîna domdar de hilîne. etcd hin operasyonên dikana key-nirxê (wek nûvekirin) li WAL dinivîse berî ku wan bixebitîne. Ger nodek di navbera wêneyan de têk biçe û ji nû ve dest pê bike, etcd dikare danûstendinên ku ji wêneya berê ve li ser bingeha naveroka WAL-ê hatine kirin vegerîne.

Ji ber vê yekê, her gava ku xerîdar mifteyek li depoya nirxa mifteyê zêde dike an nirxa mifteyek heyî nûve dike, etcd ravekek operasyonê li WAL zêde dike, ku pelek birêkûpêk di depoya domdar de ye. Berî ku berdewam bike, DIVÊ etcd ji sedî sed piştrast be ku têketina WAL bi rastî hatiye nivîsandin. Ji bo vê yekê, Linux, karanîna banga sîstemê têrê nake write, ji ber ku operasyona nivîsandina rastîn a li ser medyaya fîzîkî dibe ku dereng bimîne. Bo nimûne, Linux dibe ku tomareke WAL di keşeya di bîra kernelê de (mînak, keşeya rûpelê) ji bo demekê bigire. Ji bo piştrastkirina ku daneyên li depoyê hatine nivîsandin, divê piştî nivîsandinê bangeke pergalê were kirin. fdatasync - Tiştê ku etcd dike ev e (wek ku di derana jêrîn de tê dîtin strace; Vir 8 - Destûra pelê WAL):

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 hilanîna domdar hin dem digire. Demek dirêj ji bo temamkirina banga fdatasync dikare bandorê li performansa etcd bike. Di belgeyên ji bo depoyê de destnîşan kirinku ji bo performansa têr pêdivî ye ku ji sedî 99-ê dirêjahiya hemî bangan be fdatasync dema nivîsandina pelê, WAL ji 10 ms kêmtir bû. Metrîkên din ên têkildarî hilanînê hene, lê ev gotar dê li ser vê yekê hûr bibe.

Nirxandina hilanînê bi bikaranîna fio

Hûn dikarin binirxînin ka hin hilanînê ji bo karanîna bi etcd re bi karanîna karûbar re maqûl e fio - Testerek I/O ya populer. Bînin bîra xwe ku I/O-ya dîskê dikare bi awayên cûda çêbibe: hevdeng / async, gelek çînên cûda yên bangên pergalê, hwd. Aliyê din ê meselê ew e fio karanîna pir dijwar. Vebijêrk gelek parametre hene, û berhevokên cûda yên nirxên wan rê li ber encamên bi tevahî cûda vedike. Ji bo ku hûn texmînek maqûl ji bo etcd bistînin, divê hûn pê ewle bin ku barkirina nivîsandinê ya ku ji hêla fio ve hatî hilberandin bi qasî ku gengaz dibe dişibihe barkirina nivîsandina etcd ya pelên WAL:

  • Ev tê wê wateyê ku hilberandin fio bargiraniya kar bi kêmanî divê rêzek nivîsandinên lihevhatî li pelek be, ku her operasyona nivîsandinê ji bangek pergalê pêk tê. writeli pey fdatasync.
  • Ji bo çalakkirina tomarkirina rêzdar, divê hûn ala diyar bikin --rw=write.
  • ku fio bi karanîna bangan nivîsand write (û ne bangên pergalê yên din - mînakî, pwrite), ala bikar bînin --ioengine=sync.
  • Di dawiyê de, ala --fdatasync=1 garantî dike ku li pişt her write divêt fdatasync.
  • Di mînaka me de du pîvanên din: --size и --bs - Dibe ku li gorî doza karanîna taybetî cûda bibe. Di beşa pêş de dê diyar bike ka meriv çawa wan mîheng dike.

Çima me fio hilbijart û em çawa fêr bûn ku meriv wê çawa saz bike

Ev têbînî ji dozek rastîn a ku me pê re rû bi rû maye tê. Li ser Kubernetes v1.13 bi çavdêriya li ser Prometheus komek me hebû. Ji bo etcd v3.2.24 ajokarên dewleta hişk wekî hilanînê hatine bikar anîn. Metrîkên etcd derengiyên pir zêde nîşan dan fdatasync, tewra dema ku kom bêkar bû. Me dît ku ev metrîk pir bi guman in û em nebawer bûn ku ew bi rastî çi temsîl dikin. Wekî din, kom ji makîneyên virtual pêk dihat, ji ber vê yekê ne gengaz bû ku meriv bibêje ka dereng ji ber virtualbûnê ye an SSD sûcdar in.

Wekî din, me li guhertinên cihêreng ên mîhengên hardware û nermalavê dinêrî, ji ber vê yekê ji me re rêyek hewce bû ku em wan binirxînin. Bê guman, dê gengaz be ku di her veavakirinê de etcd bimeşînin û li metrikên Prometheus-ê yên têkildar binihêrin, lê ev hewce dike ku hewildanek girîng hewce bike. Ji me re rêyek hêsan hewce bû ku em veavakirinek taybetî binirxînin. Me xwest em têgihîştina xwe ya metrîka Prometheus ku ji etcd tê biceribînin.

Ji bo vê yekê, du pirsgirêk divê bêne çareser kirin:

  • Pêşîn, barkirina I/O ya ku etcd çêdike dema ku li pelên WAL dinivîse çawa xuya dike? Çi bangên pergalê têne bikaranîn? Mezinahiya bloka nivîsandinê çi ye?
  • Ya duyemîn, em bêjin ku em ji pirsên jorîn re bersiv hene. Meriv çawa bi barkirina têkildar re hilberandin fio? Di encamê da fio - karûbarek zehf maqûl bi pir parametre (ev hêsan e ku were verast kirin, mînakî, vir - nêzîkî. werger.).

Me her du pirsgirêk bi karanîna heman nêzîkatiya ferman-based çareser kir lsof и strace:

  • Bi alîkariya alîkariya lsof Hûn dikarin hemî ravekerên pelan ên ku ji hêla pêvajoyek ve têne bikar anîn, û her weha pelên ku ew jê re vedibêjin bibînin.
  • Bi alîkariya alîkariya strace hûn dikarin pêvajoyek jixwe dimeşe analîz bikin an pêvajoyek bimeşînin û lê temaşe bikin. Ferman hemî bangên pergalê yên ku ji hêla vê pêvajoyê ve hatî çêkirin û, vebijarkî, neviyên wê nîşan dide. Ya paşîn ji bo pêvajoyên ku diqewimin girîng e, û hwd yek ji wan pêvajoyên e.

Yekem tiştê ku me kir bikar anîn bû strace ji bo lêkolîna servera etcd di koma Kubernetes de dema ku ew bêkar bû.

Ji ber vê yekê, hate kifş kirin ku blokên nivîsandinê yên di WAL de pir zexm têne kom kirin, ku piraniya wan di navbera 2200-2400 byte de ne. Ji ber vê yekê fermana di destpêka vê gotarê de ala bikar tîne --bs=2300 (bs - Mezinahiya her blokek tomarkirinê di bytes de fio).

Ji kerema xwe bala xwe bidin ku dibe ku mezinahiyên blokên nivîsandinê yên etcd li gorî guherto, bicîhkirin, nirxên parametreyê, hwd cûda bibin. - ev bandorê li ser demajoyê dike fdatasync. Heke we dozek karanîna wekhev heye, bi wan re analîz bikin strace pêvajoyên we yên etcd da ku nirxên herî dawî bistînin.

Dûv re, ji bo ku em têgihîştinek zelal û berfireh a ka etcd bi pergala pelê re çawa dixebite, me ew ji bin da meşandin strace bi alayan -ffttT. Vê yekê gengaz kir ku meriv pêvajoyên zarokê bigire û hilberîna her yekê li pelek cûda binivîse. Digel vê yekê, di derbarê dema destpêkirinê û dirêjahiya her banga pergalê de agahdariya berfireh hate bidestxistin.

Me ferman jî bi kar anî lsofji bo ku têgihîştina we ya encamnameyê piştrast bike strace li gorî kîjan danasîna pelê ji bo çi armancê hatiye bikaranîn. Encam bû strace, mîna ya jorîn. Manîpulasyonên îstatîstîkî yên bi demên hevdemkirinê re ev metrik piştrast kir wal_fsync_duration_seconds ji etcd matches bangên fdatasync bi ravekerên pelê WAL.

Ji bo hilberandinê bikar bînin fio bargiraniya xebatê ya mîna barkirina ji etcd, belgeya kargêriyê hate lêkolîn kirin û pîvanên ku ji bo karê me guncan in hatin hilbijartin. Me piştrast kir ku bangên pergalê yên rast tevlê bûne û bi xebitandinê dirêjahiya wan piştrast kir fio ji strace (wek ku di meseleya etcd de hate kirin).

Bi taybetî bal kişand ser diyarkirina nirxa pîvanê --size. Ew tevahî barkirina I/O ya ku ji hêla kargêriya fio ve hatî çêkirin temsîl dike. Di rewşa me de, ev hejmara giştî ya baytên ku ji medyayê re hatine nivîsandin e. Ew rasterast bi hejmara bangan re têkildar e writefdatasync). Ji bo hinek bs hejmara bangên fdatasync wek hev size / bs.

Ji ber ku em bi sedî eleqedar bûn, me hewl da ku em pê ewle bin ku hejmara nimûneyan ji bo girîngiya statîstîkî têra xwe mezin e. Û wan biryar da 10^4 (ku bi mezinahiya 22 MB re têkildar e) dê bes be. Nirxên parametreyên piçûktir --size dengek zelaltir hilberandin (mînak, bang fdatasync, ku ji gelemperî pir dirêjtir digire û bandorê li sedî 99-an dike).

Tê ji wê hez bikin

Gotar nîşan dide ka meriv çawa bikar tîne fio hûn dikarin binirxînin ka gelo medyaya ku ji bo karanîna bi etcd hatî armanc kirin têra xwe bilez e. Niha ew li ser we ye! Hûn dikarin di karûbarê de bi hilanînê-based SSD-ê makîneyên virtual keşif bikin Cloud IBM.

PS ji wergêr

Bi mînakên hazir ên bikaranînê fio ji bo çareserkirina pirsgirêkên din dikarin di nav de bibînin belgekirin an rasterast bi depoyên projeyê (li wir ji yên ku di belgeyê de hatine behs kirin pirtir in).

PPS ji wergêr

Li ser bloga me jî bixwînin:

Source: www.habr.com

Ji bo malperên bi parastina DDoS, serverên VPS VDS mêvandariya pêbawer bikirin 🔥 Hostinga malperê ya pêbawer bi parastina DDoS, serverên VPS VDS bikirin | ProHoster