A velocità di almacenamiento adattata per etcd? Dumandimu à fio

A velocità di almacenamiento adattata per etcd? Dumandimu à fio

Una storia corta nantu à fio è etcd

Prestazione di u cluster eccd dipende largamente da u rendiment di u so almacenamentu. etcd esporta alcune metriche à Prometheusper furnisce l'infurmazioni di rendiment di almacenamentu desiderate. Per esempiu, a metrica wal_fsync_duration_seconds. A documentazione per etcd dice: Per esse cunsideratu abbastanza veloce, u percentile 99 di sta metrica deve esse menu di 10 ms. Sè vo site à pianificà di eseguisce un cluster etcd in macchine Linux è vulete valutà se u vostru almacenamentu hè abbastanza veloce (per esempiu, SSD), pudete aduprà fio hè un strumentu populari per pruvà l'operazioni I/O. Eseguite u cumandimu seguitu, induve test-data hè u cartulare sottu u puntu di muntagna di almacenamiento:

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

Basta à vede i risultati è verificate chì u 99 percentile di a durata fdatasync menu di 10 ms. Sì cusì, avete un almacenamentu abbastanza veloce. Eccu un esempiu di i risultati:

  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]

Noti

  • Avemu persunalizatu l'opzioni --size è --bs per u nostru scenariu particulari. Per ottene un risultatu utile da fio, furnisce i vostri valori. Induve li uttene ? Leghjite cumu avemu amparatu à cunfigurà fio.
  • Durante a prova, tutta a carica I/O vene da fio. In un scenariu di a vita reale, ci saranu prubabilmente altre richieste di scrittura chì venenu in u almacenamentu oltre à quelli chì sò ligati à wal_fsync_duration_seconds. A carica extra aumenterà u valore di wal_fsync_duration_seconds. Allora se u percentile 99 hè vicinu à 10ms, u vostru almacenamentu hè esauritu di velocità.
  • Pigliate a versione fio micca menu di 3.5 (i precedenti ùn mostranu micca i percentili di durata di fdatasync).
  • Sopra hè solu un snippet di i risultati di fio.

Longa storia di fio è etcd

Cosa hè WAL in etcd

Di solitu usanu basa di dati log di scrittura in anticipu; etcd l'utiliza ancu. Ùn discuteremu micca u logu di scrittura anticipata (WAL) in dettaglio quì. Ci hè abbastanza per sapè chì ogni membru di u cluster etcd u mantene in almacenamiento persistente. etcd scrive ogni operazione chjave-valore (cum'è una aghjurnazione) à WAL prima di applicà à a tenda. Se unu di i membri di l'almacenamiento crash è riavvia trà snapshots, pò restaurà lucale transazzione da l'ultima snapshot da u cuntenutu WAL.

Quandu un cliente aghjusta una chjave à u magazzinu di chjave-valore o aghjurnà u valore di una chjave esistente, etcd registra l'operazione in WAL, chì hè un schedariu regulare in almacenamiento persistente. etcd DEVE esse cumplettamente sicuru chì l'entrata WAL hè accaduta in realtà prima di cuntinuà cù u processu. In Linux, una chjama di sistema ùn hè micca abbastanza per questu. scrivemu, postu chì a scrittura attuale à u almacenamiento fisicu pò esse ritardata. Per esempiu, Linux pò almacenà una entrata WAL in una cache in memoria di kernel (cum'è una cache di pagina) per qualchì tempu. È per chì i dati sò scritti accuratamente in u almacenamentu persistente, a chjama di u sistema fdatasync hè necessariu dopu a scrittura, è etcd solu l'utiliza (cum'è pudete vede in u risultatu di u travagliu). strazza, induve 8 hè u descrittore di u file 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>

Sfurtunatamente, scrive à u almacenamiento persistente ùn succede micca istantaneamente. Se a chjama di fdatasync hè lenta, a prestazione di u sistema etcd soffre. A documentazione per etcd dicechì l'almacenamiento hè cunsideratu abbastanza veloce se, in u percentile 99, e chjama di fdatasync piglianu menu di 10ms per scrive à u schedariu WAL. Ci sò altre metriche utili per u almacenamentu, ma in questu post parlemu solu di sta metrica.

Stima di u almacenamentu cù fio

Sè avete bisognu di valutà se u vostru almacenamentu hè adattatu per etcd, utilizate fio, un strumentu assai populari di teste di carica I/O. Hè ricurdatu chì l'operazioni di discu pò esse assai diffirenti: sincroni è asincroni, assai classi di chjama di sistema, etc. In u risultatu, fio hè abbastanza difficiuli di utilizà. Hà parechji parametri, è diverse cumminazzioni di i so valori pruducenu carichi di travagliu I / O assai diffirenti. Per uttene figure adatte per etcd, duvete assicuratevi chì a carica di scrittura di prova da fio hè u più vicinu pussibule à a carica attuale da etcd quandu scrive i schedari WAL.

Dunque, fio duveria, à u minimu, creà una carica di una seria di scrittura sequenziale à u schedariu, ogni scrittura serà cumpostu di una chjama di sistema. scrivemuseguita da a chjama di u sistema fdatasync. Scritture sequenziali à fio necessitanu l'opzione --rw=write. Per fio per utilizà a chjama di u sistema di scrittura quandu scrive, invece di scrive, duvete specificà u paràmetru --ioengine=sync. Infine, per chjamà fdatasync dopu ogni scrittura, avete bisognu di aghjunghje u paràmetru --fdatasync=1. L'altri dui opzioni in questu esempiu (--size è -bs) sò script specifichi. In a sezione dopu, vi mustraremu cumu si stallanu.

Perchè fio è cumu avemu amparatu à stallà

In questu post, discrimu un casu reale. Avemu un cluster Kubernetes v1.13 chì avemu monitoratu cù Prometheus. etcd v3.2.24 hè stata ospitata nantu à un SSD. E metriche di Etcd dimustranu latenze fdatasync troppu altu, ancu quandu u cluster ùn facia nunda. E metriche eranu strane è ùn sapemu micca veramente ciò chì vulianu dì. U cluster era custituitu di macchine virtuali, era necessariu di capisce quale era u prublema: in SSD fisici o in a capa di virtualizazione. Inoltre, avemu spessu fattu cambiamenti à a cunfigurazione di hardware è software, è avemu bisognu di un modu per evaluà i so risultati. Pudemu eseguisce etcd in ogni cunfigurazione è fighjate à e metriche di Prometheus, ma hè troppu fastidiu. Avemu cercatu un modu abbastanza simplice per evaluà una cunfigurazione specifica. Vulemu verificà s'ellu capimu a metrica Prometheus da etcd currettamente.

Ma per questu, dui prublemi anu da esse risolti. Prima, quale hè a carica I / O chì etcd crea quandu scrive à WAL pare? Chì chjamate di sistema sò aduprate? Chì hè a dimensione di i registri? Siconda, se rispondemu à sti dumande, cumu ripruducemu una carica di travagliu simili cù fio? Ùn vi scurdate chì fio hè un strumentu assai flexible cù parechje opzioni. Avemu risoltu i dui prublemi cù un approcciu - utilizendu i cumandamenti lsof и strazza. lsof elenca tutti i descrittori di schedari utilizati da u prucessu è i so fugliali assuciati. È cù strace, pudete esaminà un prucessu digià in esecuzione, o principià un prucessu è esaminà. strace stampa tutte e chjama di u sistema da u prucessu esaminatu (è i so prucessi figlioli). L'ultimu hè assai impurtante, postu chì etcd hè solu piglià un approcciu simili.

Prima avemu usatu strace per esplorà u servitore etcd per Kubernetes quandu ùn ci era micca carica nantu à u cluster. Avemu vistu chì quasi tutti i registri WAL eranu circa a stessa dimensione: 2200-2400 bytes. Dunque, in u cumandamentu à u principiu di u postu, avemu specificatu u paràmetru -bs = 2300 (bs significa a dimensione in bytes per ogni entrata fio). Nota chì a dimensione di l'entrata etcd dipende da a versione etcd, a distribuzione, i valori di i paràmetri, etc., è affetta a durata di fdatasync. Sè vo avete un scenariu simile, esaminà i vostri prucessi etcd cù strace à truvà fora i numeri esatti.

Allora, per avè una bona idea di ciò chì face u sistema di fugliale etcd, avemu principiatu cù strace è l'opzioni -ffttT. Allora avemu pruvatu à esaminà i prucessi di u zitellu è arregistrà a pruduzzioni di ognuna di elli in un schedariu separatu, è ancu ottene rapporti detallati nantu à u principiu è a durata di ogni chjama di u sistema. Avemu usatu lsof per cunfirmà a nostra analisi di l'output strace è vede quale descriptore di u schedariu hè stata utilizata per quale scopu. Cusì cù l'aiutu di strace, i risultati mostrati sopra sò stati ottenuti. E statistiche di u tempu di sincronizazione cunfirmanu chì wal_fsync_duration_seconds da etcd hè coherente cù e chjama di fdatasync cù descriptori di file WAL.

Avemu passatu a documentazione per fio è hà sceltu l'opzioni per u nostru script per chì fio generà una carica simile à etcd. Avemu verificatu ancu e chjama di u sistema è a so durata esecutendu fio da strace, simili à etcd.

Avemu sceltu currettamente u valore di u paràmetru --size per rapprisintà tutta a carica I/O da fio. In u nostru casu, questu hè u numeru tutale di bytes scritti in u almacenamiento. Risultava esse direttamente proporzionale à u numeru di chjama di u sistema di scrittura (è fdatasync). Per un certu valore di bs, u numeru di fdatasync calls = size/bs. Siccomu eramu interessatu in u percentile, avemu avutu avè abbastanza mostri per esse sicuru, è avemu calculatu chì 10 ^ 4 seria abbastanza per noi (chì hè 22 mebibytes). Se --size hè più chjuca, ponu accade outliers (per esempiu, parechje chjamate fdatasync pigghianu più di u solitu è ​​affettanu u percentile 99).

Pruvate voi stessu

Vi avemu dimustratu cumu utilizà fio è vede se l'almacenamiento hè abbastanza veloce per un altu rendiment, etcd. Avà pudete pruvà per sè stessu aduprendu, per esempiu, macchine virtuali cù almacenamiento SSD in IBM Cloud.

Source: www.habr.com

Add a comment