Saxlama sürəti etcd üçün uyğundur? Fiodan soruşaq

Saxlama sürəti etcd üçün uyğundur? Fiodan soruşaq

Fio və s. haqqında qısa hekayə

Klaster performansı və s əsasən onun saxlanmasının performansından asılıdır. etcd bəzi ölçüləri ixrac edir Prometeyİstədiyiniz yaddaş performansı məlumatını təmin etmək. Məsələn, wal_fsync_duration_seconds metrikası. etcd üçün sənədlər deyir: Yaddaşın kifayət qədər sürətli hesab edilməsi üçün bu metrikanın 99-cu faizi 10 ms-dən az olmalıdır. Linux maşınlarında etcd klasterini işə salmağı planlaşdırırsınızsa və yaddaşınızın kifayət qədər sürətli olub olmadığını (məsələn, SSD) qiymətləndirmək istəyirsinizsə, istifadə edə bilərsiniz. fio I/O əməliyyatlarını sınaqdan keçirmək üçün məşhur vasitədir. Aşağıdakı əmri yerinə yetirin, burada test-data saxlama quraşdırma nöqtəsinin altındakı qovluqdur:

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

Sadəcə nəticələrə baxmaq və müddətin 99-cu faizinin olduğunu yoxlamaq lazımdır fdatasync 10 ms-dən az. Əgər belədirsə, kifayət qədər sürətli yaddaşınız var. Nəticələrə bir nümunə:

  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]

Qeydlər

  • Biz xüsusi ssenarimiz üçün --size və --bs seçimlərini fərdiləşdirmişik. Fio-dan faydalı nəticə əldə etmək üçün öz dəyərlərinizi təmin edin. Onları haradan almaq olar? Oxuyun fio-nu konfiqurasiya etməyi necə öyrəndik.
  • Test zamanı bütün I/O yükü fio-dan gəlir. Real həyat ssenarisində, wal_fsync_duration_seconds ilə əlaqəli olanlardan başqa yaddaşa daxil olan digər yazma sorğuları da olacaq. Əlavə yük wal_fsync_duration_seconds dəyərini artıracaq. Beləliklə, 99-cu faiz 10 ms-ə yaxındırsa, yaddaşınızın sürəti tükənir.
  • Versiyanı götürün fio 3.5-dən aşağı deyil (əvvəlkilər fdatasync müddəti faizlərini göstərmir).
  • Yuxarıda fio-dan alınan nəticələrin yalnız bir hissəsidir.

Fio və s. haqqında uzun hekayə

WAL nədir və s

Adətən verilənlər bazası istifadə edir qabaqcadan yazma jurnalı; etcd də ondan istifadə edir. Biz burada qabaqcadan yazma jurnalını (WAL) ətraflı müzakirə etməyəcəyik. Etcd klasterinin hər bir üzvünün onu davamlı yaddaşda saxladığını bilmək bizim üçün kifayətdir. etcd mağazaya tətbiq etməzdən əvvəl hər bir açar-dəyər əməliyyatını (məsələn, yeniləmə) WAL-a yazır. Yaddaş üzvlərindən biri qəzaya uğrasa və snapshotlar arasında yenidən başlasa, o, WAL məzmunu ilə sonuncu snapşotdan sonra tranzaksiyaları yerli olaraq bərpa edə bilər.

Müştəri açar-dəyər anbarına açar əlavə etdikdə və ya mövcud açarın dəyərini yenilədikdə, etcd əməliyyatı davamlı yaddaşda olan adi fayl olan WAL-da qeyd edir. etcd emala davam etməzdən əvvəl WAL girişinin həqiqətən baş verdiyinə tam əmin olmalıdır. Linux-da bunun üçün bir sistem çağırışı kifayət deyil. yazmaq, çünki fiziki yaddaşa faktiki yazma gecikə bilər. Məsələn, Linux bir müddət WAL girişini nüvə yaddaşında (məsələn, səhifə keşi) keşdə saxlaya bilər. Məlumatların davamlı yaddaşa dəqiq yazılması üçün yazdıqdan sonra fdatasync sistem çağırışı lazımdır və etcd sadəcə ondan istifadə edir (işin nəticəsində gördüyünüz kimi) zolaq, burada 8 WAL fayl deskriptorudur):

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>

Təəssüf ki, davamlı yaddaşa yazmaq dərhal baş vermir. Fdatasync çağırışı yavaş olarsa, etcd sisteminin performansı pisləşəcək. etcd üçün sənədlər deyir99-cu faizdə fdatasync zəngləri WAL faylına yazmaq üçün 10 ms-dən az vaxt tələb edərsə, yaddaş kifayət qədər sürətli hesab edilir. Saxlama üçün başqa faydalı ölçülər var, lakin bu yazıda biz yalnız bu metrikdən danışırıq.

fio ilə yaddaşın qiymətləndirilməsi

Yaddaşınızın etcd üçün uyğun olub olmadığını qiymətləndirmək lazımdırsa, çox məşhur I/O yük test aləti olan fio-dan istifadə edin. Yadda saxlamaq lazımdır ki, disk əməliyyatları çox müxtəlif ola bilər: sinxron və asinxron, sistem zənglərinin bir çox sinifləri və s. Nəticədə fio-dan istifadə etmək kifayət qədər çətindir. Onun bir çox parametrləri var və onların dəyərlərinin müxtəlif kombinasiyaları çox fərqli I/O iş yükləri yaradır. etcd üçün adekvat rəqəmlər əldə etmək üçün WAL fayllarını yazarkən fio-dan test yazma yükünün etcd-dən gələn faktiki yükə mümkün qədər yaxın olduğundan əmin olmalısınız.

Buna görə də, fio, ən azı, fayla bir sıra ardıcıl yazılar şəklində bir yük yaratmalıdır, hər bir yazı sistem çağırışından ibarət olacaqdır. yazmaqardınca fdatasync sistem çağırışı. Fio-ya ardıcıl yazılar --rw=write seçimini tələb edir. Fio yazarkən yazı sistemindən istifadə etmək əvəzinə zəng edin yaz, siz --ioengine=sync parametrini təyin etməlisiniz. Nəhayət, hər yazdıqdan sonra fdatasync çağırmaq üçün --fdatasync=1 parametrini əlavə etməlisiniz. Bu misaldakı digər iki seçim (--size və -bs) skriptə xasdır. Növbəti hissədə onları necə quracağınızı sizə göstərəcəyik.

Niyə məhz fio və onu necə qurmağı öyrəndik

Bu yazıda real bir hadisəni təsvir edirik. Bizim klasterimiz var Kubernetes Prometey ilə izlədiyimiz v1.13. etcd v3.2.24 SSD-də yerləşdirilib. Etcd ölçüləri, klaster heç bir şey etmədikdə belə, fdatasync gecikmələrini çox yüksək göstərdi. Metriklər qəribə idi və biz onların nə demək olduğunu bilmirdik. Klaster virtual maşınlardan ibarət idi, problemin nə olduğunu anlamaq lazım idi: fiziki SSD-lərdə və ya virtuallaşdırma qatında. Bundan əlavə, biz tez-tez aparat və proqram təminatının konfiqurasiyasına dəyişikliklər edirdik və onların nəticələrini qiymətləndirmək üçün bizə bir üsul lazım idi. Biz hər konfiqurasiyada etcd işlədə və Prometheus göstəricilərinə baxa bilərdik, lakin bu, həddən artıq çətinlikdir. Biz konkret konfiqurasiyanı qiymətləndirmək üçün kifayət qədər sadə yol axtarırdıq. Biz etcd-dən Prometheus ölçülərini düzgün başa düşdüyümüzü yoxlamaq istədik.

Ancaq bunun üçün iki problem həll edilməli idi. Birincisi, WAL-a yazarkən etcd-nin yaratdığı I/O yükü nə kimi görünür? Hansı sistem zənglərindən istifadə olunur? Qeydlərin ölçüsü nədir? İkincisi, bu suallara cavab versək, oxşar iş yükünü fio ilə necə təkrarlaya bilərik? Unutmayın ki, fio bir çox variantları olan çox çevik bir vasitədir. Biz hər iki problemi bir yanaşmada - əmrlərdən istifadə etməklə həll etdik lap и zolaq. lsof proses tərəfindən istifadə edilən bütün fayl deskriptorlarını və onlarla əlaqəli faylları siyahıya alır. Və strace ilə siz artıq işləyən prosesi yoxlaya və ya prosesə başlaya və onu yoxlaya bilərsiniz. strace araşdırılan prosesdən (və onun uşaq proseslərindən) bütün sistem çağırışlarını çap edir. Sonuncu çox vacibdir, çünki etcd sadəcə oxşar yanaşma tətbiq edir.

Biz ilk olaraq klasterdə yük olmadıqda Kubernetes üçün etcd serverini araşdırmaq üçün strace-dən istifadə etdik. Demək olar ki, bütün WAL qeydlərinin təxminən eyni ölçüdə olduğunu gördük: 2200–2400 bayt. Buna görə də yazının əvvəlindəki komandada -bs=2300 parametrini təyin etdik (bs hər fio girişi üçün baytla ölçü deməkdir). Qeyd edək ki, etcd girişinin ölçüsü etcd versiyasından, paylanmadan, parametr dəyərlərindən və s. asılıdır və fdatasync müddətinə təsir edir. Bənzər bir ssenariniz varsa, dəqiq rəqəmləri tapmaq üçün etcd proseslərinizi strace ilə yoxlayın.

Sonra, etcd fayl sisteminin nə etdiyi barədə yaxşı bir fikir əldə etmək üçün onu strace və -ffttT seçimləri ilə başladıq. Beləliklə, biz uşaq proseslərini araşdırmağa və onların hər birinin çıxışını ayrı bir faylda qeyd etməyə, həmçinin hər bir sistem çağırışının başlanğıcı və müddəti haqqında ətraflı hesabatlar almağa çalışdıq. Strace çıxışı ilə bağlı təhlilimizi təsdiqləmək və hansı fayl deskriptorunun hansı məqsədlə istifadə olunduğunu görmək üçün lsof-dan istifadə etdik. Beləliklə, strace köməyi ilə yuxarıda göstərilən nəticələr əldə edildi. Sinxronizasiya vaxtı statistikası etcd-dən wal_fsync_duration_seconds-ın WAL fayl deskriptorları ilə fdatasync zənglərinə uyğun olduğunu təsdiqlədi.

Biz fio üçün sənədləri nəzərdən keçirdik və skriptimiz üçün seçimlər seçdik ki, fio etcd-ə bənzər bir yük yaratsın. Biz, həmçinin etcd-ə bənzər strace-dən fio işlətməklə sistem zənglərini və onların müddətini yoxladıq.

Fio-dan bütün I/O yükünü təmsil etmək üçün --size parametrinin dəyərini diqqətlə seçdik. Bizim vəziyyətimizdə bu, yaddaşa yazılan baytların ümumi sayıdır. Yazma (və fdatasync) sistem zənglərinin sayı ilə düz mütənasib olduğu ortaya çıxdı. Müəyyən bs dəyəri üçün fdatasync çağırışlarının sayı = size/bs. Faizlə maraqlandığımız üçün əmin olmaq üçün kifayət qədər nümunəmiz olmalı idi və hesabladıq ki, 10^4 bizim üçün kifayət edər (bu, 22 mebibaytdır). Əgər --size daha kiçikdirsə, kənar göstəricilər yarana bilər (məsələn, bir neçə fdatasync çağırışı həmişəkindən daha uzun çəkir və 99-cu faizə təsir edir).

Özünüz cəhd edin

Biz sizə fio-dan necə istifadə edəcəyinizi və etcd-nin yaxşı işləməsi üçün yaddaşın kifayət qədər sürətli olub olmadığını göstərdik. İndi, məsələn, SSD yaddaşı olan virtual maşınlardan istifadə edərək, özünüz üçün sınaqdan keçirə bilərsiniz IBM Cloud.

Mənbə: www.habr.com

Добавить комментарий