Tarkibga o'tish

Resurslar bo'yicha troubleshooting

"Server sekinlashib qoldi" degan shikoyat to'rtta butunlay boshqa-boshqa sababga borib taqalishi mumkin: CPU yetishmasligi, RAM tugab borayotgani, disk I/O to'yinib qolgani yoki disk to'lib qolgani. Jarayonlarni kuzatish va Jarayon xotirasi maqolalarida CPU va xotira bitta jarayon darajasida chuqur ko'rib chiqilgan, Disk va fayl tizimi asoslari maqolasida esa disk sig'imi ko'rilgan. Lekin muammo haqiqatan paydo bo'lganda birinchi savol boshqacha bo'ladi: "bu to'rttasidan qaysi biri?" Bu maqola aynan shu birinchi, tezkor saralash (triage) qadami haqida: CPU, xotira va diskni bitta umumiy ko'rinish bilan solishtirish, so'ng aybdor bo'lib chiqqan resursni chuqur o'rganishga o'tish.

Nega bitta vosita yetarli emas

top CPU va xotirani birga ko'rsatadi, lekin disk I/O haqida deyarli hech narsa aytmaydi. free faqat xotirani qamrab oladi. df faqat disk sig'imini qamrab oladi. Agar haqiqiy muammo disk tezligida bo'lsa-yu, siz faqat top ni tekshirsangiz, CPU va xotira butunlay normal ko'rinishi mumkin — va vaqt noto'g'ri joydan qidirishga sarflanadi. Shuning uchun birinchi saralash qadami har doim barcha resurslarni bir yo'la ko'rsatadigan vosita bo'lishi kerak.

vmstat: to'rtta resurs bitta ekranda

vmstat 2 5

Bu statistikani har 2 soniyada, jami 5 marta chiqaradi:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 3400200 812400 2200800    0    0    12    30  140  310  8  3 88  1  0
 6  4      0 3398100 812400 2201900    0    0  1840  2200  310  520 10  6 40 44  0

Ustunlar to'rt guruhga bo'linadi:

Guruh Ustun Ma’nosi
procs r CPU’ni kutayotgan, bajarilishga tayyor jarayonlar soni
b Uzilmaydigan uyqudagi, odatda disk I/O'ni kutayotgan jarayonlar soni
memory free Bo'sh RAM, KiB da
buff/cache Disk keshlash uchun ishlatilayotgan xotira — Jarayon xotirasi maqolasida ko'rilgan o'sha buff/cache
swap si/so Soniyasiga swap’dan o'qilgan/swap’ga yozilgan hajm
io bi/bo Soniyasiga diskdan o'qilgan/diskka yozilgan bloklar
cpu us/sy User-space va kernel kodi uchun sarflangan CPU foizi
wa CPU disk I/O yakunlanishini kutib, bo'sh turgan vaqt foizi

Ikkinchi qator birinchisidan butunlay boshqacha manzara chizadi: r (6) ham, b (4) ham oshgan, wa esa 44 — bu CPU’ning o'zi band emasligini (us+sy = 16), aksincha diskning javobini kutib bo'sh turganini bildiradi.

Info

wa (I/O wait) troubleshooting'da eng ko'p e’tibordan chetda qoladigan ustunlardan biri. Past us/sy bilan birga yuqori wa deyarli har doim CPU muammosiga emas, sekin disklarga, tarmoq fayl tizimiga (NFS) yoki to'yingan diskka ishora qiladi.

Intervyuda

Intervyu oluvchilar tekshirishni yaxshi ko'radigan yana bir tuzoq: katta hajmdagi ishlatilgan swap’ning o'zi tizimda muammo borligini anglatmaydi. Muhimi — si/so. Agar swpd katta ishlatilgan qiymatni ko'rsatib tursa-yu, ikkalasi ham nolga yaqin bo'lsa, bu odatda sovuq (kam ishlatiladigan) sahifalar ancha oldin bir marta swap’ga chiqarilgani va u yerda shunchaki ishlatilmay turganini bildiradi; tizim faol thrashing qilmayapti. Faol swap thrashing qat’iy swpd soni sifatida emas, davom etayotgan, noldan farqli si/so sifatida namoyon bo'ladi. Bu farq Jarayon xotirasi maqolasida chuqurroq ko'rib chiqilgan.

Load average: birinchi raqam va u nimani yashiradi

vmstat dan oldin eng tez bitta nazar — load average: uptime (va top) oxirgi 1, 5 va 15 daqiqa uchun ko'rsatadigan uchta raqam:

uptime
 12:40:02 up 3 days,  4:11,  2 users,  load average: 7.82, 4.10, 2.05

Ikki narsa bu raqamni keng tarzda noto'g'ri o'qishga sabab bo'ladi:

  • U yadrolar soniga nisbatan. 7.82 load 4 yadroli mashinada to'yinish, 16 yadroli mashinada esa bemalol holat — har doim nproc chiqishiga bo'ling. Bu yerdagi o'sish tendensiyasi (1 daqiqada 7.82, 15 daqiqada 2.05) bosim yaqinda boshlangani va oshib borayotganini ko'rsatadi, bu esa ko'pincha mutlaq qiymatdan foydaliroq.
  • Linux’da u CPU’dan ko'proq narsani sanaydi. Ko'p boshqa Unix’lardan farqli o'laroq, Linux load’i faqat CPU kutayotgan jarayonlarni emas, uzilmaydigan uyqudagi (D holati, I/O kutayotgan) jarayonlarni ham o'z ichiga oladi. Aynan shu sababli CPU’lari bo'sh mashina ham 8 load ko'rsatishi mumkin — bu vmstat ning b va wa ustunlari ochib beradigan o'sha diskka bog'liq vaziyat. Past us/sy bilan yuqori load — CPU emas, I/O muammosining belgisi.

Qisqasi, load average tizim bosim ostida ekanini va u qanday o'zgarib borayotganini aytadi; qaysi resurs javobgarligini esa baribir vmstat aytadi.

Avval qaysi resursni tekshirish kerak: qaror jadvali

Bitta vmstat lahzalik ko'rinishi va quyidagi jadval keyingi qadamni tanlashga yordam beradi:

Belgi Ehtimoliy sabab Keyin qayerga borish kerak
us/sy yuqori, wa past, r katta CPU yetishmaydi Jarayonlarni kuzatish — %CPU bo'yicha tartiblash
wa yuqori, b katta Disk I/O to'yingan Quyidagi iostat bo'limi
free past, si/so noldan farqli RAM yetishmayapti, swap faol Jarayon xotirasi — free -h va OOM tekshiruvlari
Hammasi normal ko'rinadi, lekin xizmat baribir ishlamayapti Muammo resursda emas — konfiguratsiya yoki kodda systemd troubleshooting

iostat: qaysi disk aybdor

vmstat faqat umumiy I/O manzarasini beradi — qaysi qurilma muammo ekanini aytmaydi. Buning uchun sysstat paketidagi iostat ishlatiladi:

sudo apt install sysstat

Bu yerda sudo kerak, chunki yangi paket tizim kataloglariga o'rnatiladi — bu apt va repozitoriylar maqolasida ko'rilgan o'sha o'rnatish jarayoni.

iostat -x 2 3
Device            r/s     w/s   rkB/s   wkB/s  await  %util
nvme0n1           4.50   82.00   180.0  9840.0  38.20  96.40

Muhim ustunlar:

  • %util — qurilma band bo'lgan vaqt foizi. 90–100% ga yaqin qiymat disk deyarli to'yinganini va yangi so'rovlar navbatda to'planayotganini bildiradi;
  • await — so'rovning o'rtacha kutish vaqti, millisekundlarda. Zamonaviy SSD/NVMe disk uchun bir necha millisekunddan yuqori await allaqachon shubhali, o'nlab millisekundlar esa jiddiy muammoni ko'rsatadi.

Yuqoridagi chiqishda %util 96%, await esa 38ms — bu vmstat dagi yuqori wa taxmin qilgan narsani aynan tasdiqlaydi: nvme0n1 qurilmasi to'yingan.

Disk joyi: alohida, lekin ko'pincha adashtiriladigan muammo

Disk I/O (tezlik) va disk joyi (sig'im) — ikki mustaqil muammo. Disk juda tez, lekin butunlay to'la bo'lishi yoki aksincha bo'lishi mumkin. Tezkor tekshiruv:

df -h /

To'liq tahlil — inode’lar tugashi, "disk to'la, lekin du kam joy ko'rsatadi" va boshqa murakkab holatlar — Disk va fayl tizimi asoslari maqolasida allaqachon chuqur ko'rib chiqilgan; saralash bosqichida df -h dan olingan "to'lami yoki yo'qmi" degan tezkor javob yetarli.

Amaliy vaziyat: "sayt sekin javob beryapti"

Monitoring veb-server javoblari sekinlashganini bildiryapti. Quyidagi har bir buyruq faqat o'qiydi.

1-qadam. Umumiy manzarani oling.

vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  5      0 2100400 402100 3800200    0    0   210  8400  380  610 12  8 15 65  0

wa 65, b 5. CPU’ning o'zi (us+sy = 20) unchalik band emas, lekin ko'p jarayonlar diskdan javob kutyapti.

2-qadam. Qaysi qurilma "tiqilib" qolganini aniqlang.

iostat -x 2 3
Device            r/s     w/s   rkB/s   wkB/s  await  %util
nvme0n1          12.00  340.00   480.0 42000.0  61.80  98.10

%util deyarli 100%, await 62ms — disk to'yingan.

3-qadam. Bu yozishni qaysi jarayon bajarayotganini toping.

ps -eo pid,stat,comm | grep ' D '

STAT ustunidagi D uzilmaydigan uyquni bildiradi — jarayon aynan disk I/O javobini kutyapti. ps holat kodlarining to'liq izohi Jarayonlarni kuzatish maqolasida.

7801 D    postgres

Xulosa: sekinlashish CPU yoki RAM’da emas — u postgres jarayoni keltirib chiqarayotgan og'ir diskka yozishda. Keyingi qadam — ilovaning o'z log manbasi va Loglarni tahlil qilish maqolasida ko'rilgan usullar yordamida bu jarayon nega bunchalik ko'p yozayotganini aniqlash (masalan, katta indekslash amali yoki yomon yozilgan so'rov).

Keng tarqalgan xatolar

Faqat top ni tekshirib, disk I/O'ni o'tkazib yuborish

top yuqori %wa qiymatini ko'rsatishi mumkin, lekin unga qaysi qurilma yoki qaysi jarayon sabab bo'layotganini aytmaydi. Bunday holatda iostat qurilmani aniqlaydi, ps dagi D holati esa kutayotgan jarayonlarni topadi. I/O'ni to'g'ridan-to'g'ri muayyan jarayonga bog'lash uchun esa maxsus vositalar bor: sudo iotop -o (interaktiv, faqat haqiqatan I/O bajarayotgan jarayonlarni ko'rsatadi) yoki pidstat -d 2 (xuddi shu sysstat paketidan, skript uchun qulay).

%util ni CPU foizi bilan adashtirish

iostat dagi %util protsessor emas, disk qurilmasi band bo'lgan vaqt foizi. 100% CPU va 100% disk %util — turli yechimlarni talab qiladigan butunlay boshqa-boshqa muammolar.

Disk joyi va disk tezligini bir xil muammo deb hisoblash

df -h "80% ishlatilgan" deb ko'rsatishi mumkin, lekin bu I/O sekinligiga hech qanday aloqasi yo'q. Ular mustaqil o'lchovlar — biri sig'im, ikkinchisi o'tkazuvchanlik.

Mashqlar

  1. O'z tizimingizda vmstat 2 5 ni ishga tushiring, r, b va wa ustunlaridagi qiymatlarni yozib oling va ular normal yoki muammoli ko'rinishini asoslang.
  2. iostat ni sudo apt install sysstat bilan o'rnating va o'z diskingiz uchun iostat -x 2 3 dagi %util va await ustunlarini talqin qiling.
  3. Sinov VM’ida dd if=/dev/zero of=/tmp/testfile bs=1M count=2000 bilan sun’iy disk yuklamasini yarating (faqat o'chirib tashlasa bo'ladigan VM’da, /tmp ichida), u ishlayotganda vmstat 1 5 bilan wa qanday o'zgarishini kuzating, so'ng sinov faylini olib tashlang: rm /tmp/testfile.
  4. Yuqoridagi qaror jadvalidan uchta vaziyatni tanlang va har biri uchun bajaradigan tekshiruvlar ketma-ketligini yoddan yozing.

Mashqni bajardim deyish uchun: 3-mashqda vmstat chiqishidagi dd buyrug'iga javoban wa oshgan aniq qatorni ko'rsata olishingiz va nega shu oraliqda us/sy nisbatan past qolishini tushuntira olishingiz kerak.

Manbalar

  • man7.org: vmstat(8): https://man7.org/linux/man-pages/man8/vmstat.8.html
  • man7.org: iostat(1): https://man7.org/linux/man-pages/man1/iostat.1.html
  • Sysstat hujjatlari: https://github.com/sysstat/sysstat
  • man7.org: ps(1) — jarayon holati kodlari: https://man7.org/linux/man-pages/man1/ps.1.html