Jarayonlarni kuzatish: top, htop va yuklamani real vaqtda o'qish
Dasturlar va jarayonlar maqolasidagi ps sizga bitta qotgan kadrni beradi. Haqiqiy diagnostika ishlarining aksariyati — "nega bu server hozir sekin ishlayapti", "biror jarayon CPU’ni egallab olganmi", "xotira bosimi oshib boryaptimi" — buning o'rniga harakatlanuvchi tasvirni talab qiladi: uzluksiz yangilanib turadigan jarayon holati, yangilangan tizim yuklamasi va ekrandan chiqmasdan ko'rgan narsangizni saralash, filtrlash va unga nisbatan amal bajarish imkoni. top va htop aynan shuni beradi.
Bu maqolada top sarlavhasini to'g'ri o'qishni (ko'pchilik bu qismni ko'z yugurtirib o'tkazib yuboradi, holbuki load average, xotira bosimi va CPU taqsimoti aynan shu yerda), htop ning jarayonlar ro'yxati va rangli ko'rsatkichlarini talqin qilishni va ikkala vositadan yuklama muammosini shunchaki kuzatish emas, haqiqatan tashxislash uchun foydalanishni ko'rib chiqamiz.
top: jarayonlar ro'yxatidan oldingi sarlavha
top ni argumentlarsiz ishga tushirsangiz, jarayonlar jadvalidan oldingi dastlabki besh-olti qator ulardan pastdagi saralanadigan ro'yxatdan ko'ra ko'proq diagnostik ma’lumotga ega bo'ladi:
top - 14:32:07 up 6 days, 3:12, 2 users, load average: 4.15, 2.03, 0.98
Tasks: 187 total, 2 running, 184 sleeping, 0 stopped, 1 zombie
%Cpu(s): 62.3 us, 8.1 sy, 0.0 ni, 28.5 id, 0.9 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 15928.4 total, 412.6 free, 9820.1 used, 5695.7 buff/cache
MiB Swap: 2048.0 total, 1890.2 used, 157.8 free. 4103.9 avail Mem
Load average
load average: 4.15, 2.03, 0.98 mos ravishda oxirgi 1, 5 va 15 daqiqada ishga tayyor yoki uzilmas uyqu holatidagi jarayonlarning o'rtacha sonini ko'rsatadi. Bu foiz emas va 100 bilan cheklanmagan — uning ma’noli yuqori chegarasi mashinada nechta CPU yadrosi borligiga bog'liq.
Amaliy qoida: load average’ni CPU yadrolari soniga bo'ling. 4 yadroli mashinada 4.15 yuklama (4.15 / 4 ≈ 1.04) tizim o'rtacha hisobda juda oz darajada ortiqcha yuklanganini bildiradi — har bir lahzada ishga tayyor ish mavjud yadrolardan biroz ko'proq. 16 yadroli mashinada xuddi shu 4.15 (4.15 / 16 ≈ 0.26) esa tizim bemalol, kam yuklanganini ko'rsatadi.
Uchta sonni bir-biri bilan solishtirish tendensiya haqida aytadi: 4.15, 2.03, 0.98 (1 daqiqalik 5 daqiqalikdan, u esa 15 daqiqalikdan katta) yuklama hozir oshayotganini bildiradi; teskari tartib esa keskin ko'tarilishdan keyin yuklama pasayayotganini ko'rsatadi.
Intervyuda
Yadrolar sonidan yuqori load average avtomatik ravishda "CPU yetishmayapti" degani emas. Linux load average’ga ishga tayyor jarayonlar bilan birga uzilmas uyqudagi (D holati, odatda disk yoki tarmoq I/O ni kutayotgan) jarayonlarni ham qo'shib hisoblagani uchun, yuqori yuklama ko'rsatkichi pastdagi %Cpu(s) qatoridagi past CPU sarfi bilan birga kelsa, ko'pincha CPU tanqisligiga emas, I/O to'sig'iga ishora qiladi: sekin disk, to'lib ketgan NFS mount yoki qotib qolgan ma’lumotlar bazasi so'rovi. "Yuklama yuqori, CPU past" holatini tashxislash har doim keyingi qadamda wa (I/O kutish) ga, undan keyin esa odatda iostat ga qarashni anglatadi.
CPU taqsimoti qatori
%Cpu(s): 62.3 us, 8.1 sy, 0.0 ni, 28.5 id, 0.9 wa, 0.0 hi, 0.2 si, 0.0 st umumiy CPU vaqtini sakkizta toifaga bo'ladi:
| Maydon | Ma’nosi |
|---|---|
us |
user space vaqti — oddiy ilova kodi |
sy |
kernel (tizim) vaqti — system call’lar, kontekst almashinuvi, jarayon nomidan kernel tomonida bajariladigan ish |
ni |
pasaytirilgan (nice qilingan) ustuvorlik bilan ishlayotgan jarayonlarning user space vaqti |
id |
bo'sh turish (idle) — ishga tayyor ish yo'q |
wa |
I/O kutish — kamida bitta jarayon disk yoki tarmoq I/O ni kutayotgan paytda CPU bo'sh turadi |
hi |
apparat uzilishlarini qayta ishlash |
si |
dasturiy uzilishlarni qayta ishlash |
st |
"steal" vaqti — virtual mehmon tizim (guest) CPU ulushining gipervizor boshqa ijarachilar uchun olib qo'ygan qismi |
us ga nisbatan yuqori sy ko'pincha ortiqcha system call yukini bildiradi: haddan tashqari ko'p kontekst almashinuvi, birlashtirilishi kerak bo'lgan mayda I/O amallari yoki keragidan ancha ko'p syscall qiladigan noto'g'ri ishlaydigan ilova. Bulutdagi VM’da doimiy noldan farqli st (steal vaqti) jismoniy host ortiqcha yuklanganini va o'z ish yukingiz o'zgarmagan bo'lsa ham instansingiz o'z adolatli CPU ulushini olmayotganini bildiradi. Bu mehmon tizim ichida tuzatishga urinadigan narsa emas, xosting provayderining holatini tekshirish yoki boshqa instans o'lchamini ko'rib chiqish kerakligi haqidagi signal.
Vazifalar va xotira qatorlari
Tasks: 187 total, 2 running, 184 sleeping, 0 stopped, 1 zombie — ps dagi STAT kodlariga mos keladigan jonli hisob. Kichik va barqaror zombi soni odatda zararsiz (ota jarayon hali wait() ni chaqirmagan, xolos); o'sib borayotgan zombi soni esa o'z bolalarini hech qachon tozalamaydigan ota jarayonni ko'rsatadi — bu haqiqiy xato va u Signallar va jarayonlarni boshqarish maqolasida batafsilroq ko'rib chiqiladi.
Xotira qatoridagi used/free/buff/cache taqsimoti Jarayon xotirasi maqolasida chuqur tushuntirilgan. Qisqasi: faqat free haqiqatan mavjud xotirani juda kam ko'rsatadi, chunki kernel bo'sh RAM’ni ataylab disk keshi uchun ishlatadi va ilovaga kerak bo'lsa, uni darhol qaytarib beradi.
top ishlab turganda u bilan ishlash
top shunchaki statik ekran emas — bir nechta bitta tugmali buyruqlar uni qayta ishga tushirmasdan nimani va qanday ko'rsatishini o'zgartiradi:
| Tugma | Ta’siri |
|---|---|
1 |
bitta umumiy CPU o'rtachasi va har bir yadro uchun alohida qator o'rtasida almashtiradi |
M |
xotira sarfi bo'yicha saralaydi |
P |
CPU sarfi bo'yicha saralaydi (sukut bo'yicha) |
k |
PID so'raydi va unga signal yuboradi (sukut bo'yicha SIGTERM) |
r |
PID so'raydi va uning ustuvorligini o'zgartiradi (renice) |
c |
to'liq buyruq qatori va faqat dastur nomini ko'rsatish o'rtasida almashtiradi |
u |
muayyan foydalanuvchi bo'yicha filtrlaydi |
q |
chiqish |
top -H har bir jarayon uchun bitta qator o'rniga alohida thread’larni ko'rsatadi. Bu bitta ko'p thread’li jarayon (java server, parallel ishchilarga ega postgres) CPU’ni sarflayotganda va uning ichidagi aynan qaysi thread javobgar ekanini bilish kerak bo'lganda juda zarur.
-p top ni vergul bilan ajratilgan muayyan PID lar ro'yxati bilan cheklaydi; pgrep -d, -x nginx esa aniq jarayon nomiga mos keladigan natijalarni vergul bilan birlashtirib, shu ro'yxatni beradi.
htop: o'qilishi osonroq muqobil
Minimal Ubuntu Server image’ida htop oldindan o'rnatilmagan; agar u bo'lmasa, o'rnating:
htop ning oddiy top dan afzalligi funksionallikdan ko'ra ko'proq qulaylikda: yuqoridagi har bir yadro uchun rangli ko'rsatkichlar, sichqoncha bilan ishlash, vertikal va gorizontal aylantiriladigan jarayonlar ro'yxati (uzun buyruq qatorlari uchun foydali), o'rnatilgan daraxt ko'rinishi (F5 yoki t tugmasi) va pastdagi ko'rinib turadigan funksional tugmalar menyusi, shuning uchun buyruqlarni yodlash shart emas.
Ikkalasi o'rtasida o'tishda bilish foydali bo'lgan asosiy farqlar:
- Ko'rsatkichlar: yuqoridagi chiziqlar sukut bo'yicha har bir CPU yadrosini alohida, shuningdek alohida xotira va swap chiziqlarini toifa bo'yicha rang bilan ko'rsatadi (user vaqti uchun yashil, kernel vaqti uchun qizil, past ustuvorlikdagi
niceqilingan vaqt uchun ko'k). - Daraxt ko'rinishi (
F5):pstreebilan bir xil ota–bola munosabatini, lekin jonli va interaktiv ko'rsatadi. Bu ko'p jarayonli server (nginx,postgres) ostidagi aynan qaysi ishchi jarayon resurs sarflayotganini aniqlash uchun foydali. F9(Kill): faqatSIGTERMemas, signalni nomi bo'yicha so'raydi. Bu jarayonni to'liq qayta ishga tushirmasdan konfiguratsiyani qayta yuklash uchunSIGHUPyuborishda qulay — bu andoza Signallar va jarayonlarni boshqarish maqolasida ko'rib chiqilgan.F4(Filter) vaF3(Search): ko'rinadigan ro'yxatni buyruq qatoridagi matn mosligi bo'yicha toraytiradi. Bu muayyan xizmatni yuzlab jarayonlar orasidan aylantirib qidirishdan tezroq.
Note
htop va top ning xotira foizi biroz farq qilishi mumkin, chunki ikki vosita kesh va buferlarga nisbatan "ishlatilgan" xotirani turlicha hisoblashi mumkin. Aniqlik muhim bo'lganda — sig'imni rejalashtirish yoki hodisa hisoboti uchun — ikkala vositaning umumiy chizig'idan ko'ra Jarayon xotirasi maqolasida ko'rilgan free -h yoki /proc/meminfo dagi aniq raqamlarni afzal ko'ring.
Real vaziyat: yuklamaning to'satdan oshishini tashxislash
Muammo. Ogohlantirish keldi: veb-serverda load average keskin oshgan va javob vaqtlari yomonlashmoqda. Biror narsani qayta ishga tushirishga qaror qilishdan oldin, bir-ikki daqiqa ichida bu CPU raqobatimi, I/O raqobatimi yoki nazoratdan chiqqan bitta jarayonmi — shuni aniqlash kerak.
Avval hech narsani o'zgartirmasdan tekshiring:
O'sish tendensiyasi (11.82 > 6.44 > 2.10) keskin oshish yaqinda boshlangani va davom etayotganini, eskirgan ko'rsatkich emasligini tasdiqlaydi.
top ni oching va biror jarayonga qarashdan oldin avval sarlavhani o'qing:
us/sy ikkalasi ham past bo'lgan holda wa ning 67.9% bo'lishi hal qiluvchi ishora: CPU’lar hisoblash bilan to'lib ketmagan, asosan I/O ni kutib bo'sh turibdi. Bu "biror jarayon CPU’ni yondiryapti" degan asosiy sababni darhol istisno qiladi va tekshiruvni disk yoki tarmoq I/O tomonga yo'naltiradi.
Aynan qaysi jarayon bloklanganini I/O ga tegishli holat bo'yicha toraytiring:
D (uzilmas uyqu) STAT i WCHAN (jarayon ichida bloklanib turgan kernel funksiyasi — bu yerda io_schedule) bilan birga aynan shu jarayon o'z xohishi bilan bo'sh turmagani, balki saqlash qatlamini kutib qotib qolganini tasdiqlaydi.
Xulosa. Yuklamaning keskin oshishi I/O bilan bog'liq va uning markazida ma’lumotlar bazasining yozuvchi jarayoni turibdi. Keyingi qadamlar — qurilma darajasidagi to'lib ketishni iostat -x 1 bilan tekshirish, shu vaqtda zaxira nusxa olish ishi yoki katta so'rov boshlanganmi-yo'qligini tekshirish yoki yozish xatti-harakatini keskin buzishi mumkin bo'lgan deyarli to'lgan hajmni df -h bilan tekshirish — faqat jarayonlar ro'yxatiga qarab taxmin qilishdan emas, aynan shu wa dan boshlangan bitta tashxisdan bevosita kelib chiqadi.
Keng tarqalgan xatolar
Load average’ni CPU foizi deb hisoblash
Yadrolar sonini bilmasdan 8.0 yuklama hech narsani anglatmaydi. Jiddiylikni baholashdan oldin har doim nproc ga bo'ling va to'siq I/O emas, CPU degan xulosaga kelishdan oldin har doim wa ni tekshiring.
Faqat 1 daqiqalik yuklama raqamiga qarab harakat qilish
5 va 15 daqiqalik ko'rsatkichlarda allaqachon pasayayotgan qisqa 1 daqiqalik keskin oshish ko'pincha davom etayotgan hodisa emas, o'tkinchi to'lqin. Kimnidir ogohlantirishdan oldin uchala raqamni solishtiring.
Umumiy xotirani tushunmasdan %MEM bo'yicha saralash
Bir nechta jarayon (masalan, bir nechta nginx ishchi jarayoni yoki fork qilingan ilova ishchilari) ularning har biri alohida ushlab turmagan, balki aslida ulashadigan sahifalar uchun o'xshash, katta %MEM ko'rsatishi mumkin. Bunday jarayonlar bo'yicha %MEM ni qo'shib chiqish haqiqiy xotira bosimini oshirib ko'rsatadi — bu tuzoqdan qochadigan hisob-kitob uchun Jarayon xotirasi maqolasiga qarang.
Eng ko'p CPU sarflayotgan jarayonni o'ylamasdan o'ldirish
top da bir lahzalik eng yuqori %CPU ga ega jarayon muammoning sababi bo'lishi shart emas — u shunchaki ogohlantirish bilan bir vaqtga to'g'ri kelib qolgan qonuniy, kutilgan ishni (zaxira nusxa olish, rejalashtirilgan paketli ish) bajarayotgan bo'lishi mumkin. Biror narsani to'xtatishdan oldin nima ishlayotgan bo'lishi kerakligi bilan solishtirib tasdiqlang.
top’ning surat olish oralig'i qisqa keskin oshishlarni yashirishini unutish
Sukut bo'yicha top har uch soniyada yangilanadi; yarim soniya davomida CPU’ni 100% ga ko'tarib, keyin uxlab qoladigan jarayon interaktiv ko'rinishda deyarli ko'rinmasligi mumkin. Qisqa to'lqinlarni ushlash uchun pidstat 1 dan (sysstat paketidan) foydalaning yoki top -d 0.5 bilan o'lchash chastotasini oshiring.
Mashqlar
uptimevanprocni birga ishga tushiring va tizimingizning joriy 1 daqiqalik load average’i yadrolar soniga nisbatan kam yoki ortiqcha yuklanganni anglatishini hisoblang.- Bir vaqtda CPU’ni band qiladigan sikl (
yes > /dev/null &) va diskni band qiladigan sikl (masalan, bir martalik laboratoriya katalogi ichidadd if=/dev/zero of=~/lab/testfile bs=1M count=2000 oflag=direct &) ishga tushiring, so'ngtopning CPU taqsimoti qatori yordamida ularning har biri qanday turdagi yuklama qo'shayotganini ajrating. Keyin test faylni tozalang. htopda daraxt ko'rinishiga o'ting va tizimingizda ishlayotgan ko'p jarayonli xizmatning ota–bola munosabatini aniqlang (yoki boshqa hech narsa bo'lmasa,python3 -m http.serverni ishga tushirib, uning o'z jarayonlar daraxtini ko'rib chiqing).ps -eo pid,stat,wchan:20,cmdyordamida band tizimda hozirDholatidagi jarayonni toping (yoki bunday jarayon bo'lmasa, qaysi buyruq va qaysi holat jarayonni shu holatga tushirishini tushuntiring).
Mashqni bajardim deyish uchun: load average talqiningiz yadrolar soniga aniq tayanishi, I/O va CPU tashxisingiz esa shunchaki "sekin tuyuldi" emas, xulosangizni tasdiqlaydigan aniq %Cpu(s) maydoniga (wa va us/sy) asoslanishi kerak.
Manbalar
- Linux man-pages:
top(1): https://man7.org/linux/man-pages/man1/top.1.html - htop loyihasi hujjatlari: https://htop.dev/
- Linux man-pages:
proc(5)—/proc/loadavg,/proc/stat: https://man7.org/linux/man-pages/man5/proc.5.html - Linux kernel hujjatlari: CPU load accounting: https://www.kernel.org/doc/html/latest/admin-guide/pm/cpuidle.html
- Brendan Gregg: Linux Load Averages — https://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html
- Linux man-pages:
pidstat(1): https://man7.org/linux/man-pages/man1/pidstat.1.html - Linux man-pages:
iostat(1): https://man7.org/linux/man-pages/man1/iostat.1.html