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
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:
Ikki narsa bu raqamni keng tarzda noto'g'ri o'qishga sabab bo'ladi:
- U yadrolar soniga nisbatan.
7.82load 4 yadroli mashinada to'yinish, 16 yadroli mashinada esa bemalol holat — har doimnprocchiqishiga 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 (
Dholati, I/O kutayotgan) jarayonlarni ham o'z ichiga oladi. Aynan shu sababli CPU’lari bo'sh mashina ham 8 load ko'rsatishi mumkin — buvmstatningbvawaustunlari ochib beradigan o'sha diskka bog'liq vaziyat. Pastus/sybilan 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:
Bu yerda sudo kerak, chunki yangi paket tizim kataloglariga o'rnatiladi — bu apt va repozitoriylar maqolasida ko'rilgan o'sha o'rnatish jarayoni.
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 yuqoriawaitallaqachon 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:
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.
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.
%util deyarli 100%, await 62ms — disk to'yingan.
3-qadam. Bu yozishni qaysi jarayon bajarayotganini toping.
STAT ustunidagi D uzilmaydigan uyquni bildiradi — jarayon aynan disk I/O javobini kutyapti. ps holat kodlarining to'liq izohi Jarayonlarni kuzatish maqolasida.
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
- O'z tizimingizda
vmstat 2 5ni ishga tushiring,r,bvawaustunlaridagi qiymatlarni yozib oling va ular normal yoki muammoli ko'rinishini asoslang. iostatnisudo apt install sysstatbilan o'rnating va o'z diskingiz uchuniostat -x 2 3dagi%utilvaawaitustunlarini talqin qiling.- Sinov VM’ida
dd if=/dev/zero of=/tmp/testfile bs=1M count=2000bilan sun’iy disk yuklamasini yarating (faqat o'chirib tashlasa bo'ladigan VM’da,/tmpichida), u ishlayotgandavmstat 1 5bilanwaqanday o'zgarishini kuzating, so'ng sinov faylini olib tashlang:rm /tmp/testfile. - 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