11-bo‘lim

Resurslar - protsessor, xotira, yuklama

Yuklama o'rtachasi nimani anglatadi, xotira nega "to'lgan" ko'rinadi va sekinlashuv sababini qanday topish kerak.

🕑 20 daqiqa o‘qish 📄 1 593 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Yuklama o'rtachasi
  2. Xotira - "to'lgan" degani nimani anglatadi
  3. Svop
  4. OOM Killer
  5. top chiqishini o'qish
  6. Interaktiv vositalar
  7. Cheklovlar (ulimit)
  8. Tekshiruvning to'g'ri tartibi
  9. Xulosa

"Server sekin ishlayapti" - eng noaniq shikoyat. Uni to'rtta aniq savolga bo'lish kerak: protsessor bandmi, xotira yetarlimi, disk ulgurayaptimi, tarmoq to'siq bo'lyaptimi.

Yuklama o'rtachasi #

Terminal
cat /proc/loadavg | awk '{print NF " ta maydon"}'
Natija
5 ta maydon

Fayl mazmuni shunday ko'rinadi:

Natija
0.17 0.05 0.01 5/251 989
MaydonMa'no
1Oxirgi 1 daqiqa yuklama o'rtachasi
2Oxirgi 5 daqiqa
3Oxirgi 15 daqiqa
4ishlayotgan / jami jarayonlar
5Oxirgi yaratilgan PID
Yuklama o'rtachasi - foiz emas

Eng ko'p uchraydigan tushunmovchilik: 1.00 ni "100% band" deb o'qish.

Aslida bu navbatdagi jarayonlar soni. Va uni yadrolar soniga bo'lish kerak:

Yuklama1 yadroli8 yadroli
1.00To'la band, navbat yo'q12% band - bo'sh
4.003 ta jarayon kutmoqdaYarim band
8.00Jiddiy muammoTo'la band, navbat yo'q
16.00Halokat8 ta jarayon kutmoqda

Shuning uchun yuklamani doim nproc bilan birga o'qing.

Linuxda yana bir nozik joy bor: yuklamaga faqat protsessor kutayotgan jarayonlar emas, D holatidagi (disk kutayotgan) jarayonlar ham kiradi. Shu sababli Linuxda yuqori yuklama protsessor emas, disk muammosini bildirishi mumkin.

Terminal
YADRO=$(nproc)
YUK=$(cut -d' ' -f1 /proc/loadavg)
awk -v y="$YUK" -v n="$YADRO" 'BEGIN {
    nisbat = y / n
    holat = (nisbat < 0.7) ? "bo'\''sh" : (nisbat < 1.0) ? "band" : "navbat bor"
    printf "%d yadro, holat: %s\n", n, holat
}'
Natija
8 yadro, holat: bo'sh

Uchta raqamning tartibi eng muhim ma'lumot:

NaqshMa'no
5.0 2.0 1.0Yuklama o'smoqda - hozir nimadir boshlandi
1.0 2.0 5.0Yuklama tushmoqda - eng yomoni o'tdi
4.0 4.0 4.0Barqaror yuklama - normal ish rejimi
"Server sekin" - qayerdan qidirish kerak uptime - yuklama qancha? Protsessor top - %us yuqori Ilova ko'p hisoblayapti %sy yuqori Yadro band - tizim chaqiruvlari %st yuqori Qo'shni VM sizning vaqtingizni o'g'irlayapti Xotira free -h available ustuniga qarang si/so nolga teng emas Svop ishlatilyapti - yomon dmesg | grep -i oom Yadro jarayon o'ldirgan Disk / tarmoq top - %wa yuqori Disk kutilmoqda iostat -x 1 %util 100 ga yaqin df -h / df -i Disk yoki inode to'lgan Tartib muhim: avval yuklama, keyin uchtadan qaysi biri ekanini aniqlang
Bitta raqamdan boshlab, uchta yo'nalishdan birini tanlaysiz

Xotira - "to'lgan" degani nimani anglatadi #

Terminal
free -h | head -1 | tr -s ' '
Natija
 total used free shared buff/cache available
free ustunidagi eng katta yolg'on - free

Yangi administrator free ustuniga qaraydi, u kichik bo'lsa "xotira tugadi" deb xulosa qiladi. Bu deyarli har doim noto'g'ri.

Linux bo'sh xotirani disk keshiga beradi. Bu bepul tezlik: kesh kerak bo'lganda bir zumda bo'shatiladi.

UstunNimani anglatadi
totalJami o'rnatilgan xotira
usedIlovalar egallagan
freeUmuman ishlatilmayotgan - kam bo'lishi normal
buff/cacheDisk keshi - kerak bo'lsa bo'shatiladi
availableIlova ola oladigan haqiqiy xotira

Faqat available ustuni ahamiyatga ega. U kichik bo'lsa - haqiqiy muammo bor.

"Bo'sh xotira - behuda xotira" - bu Linuxning ataylab tanlangan siyosati, nosozlik emas.

Terminal
grep -E '^(MemTotal|MemAvailable|SwapTotal):' /proc/meminfo | awk '{print $1}'
Natija
MemTotal:
MemAvailable:
SwapTotal:

Foizni hisoblash:

Terminal
awk '/^MemTotal:/{t=$2} /^MemAvailable:/{a=$2}
     END {printf "ishlatilgan: %d%%\n", (t-a)*100/t}' /proc/meminfo \
    | awk '{print ($2+0 >= 0 && $2+0 <= 100) ? "foiz 0-100 oralig'\''ida" : "xato"}'
Natija
foiz 0-100 oralig'ida

Svop #

HolatMa'no
Svop bor, ishlatilmaydiNormal - zaxira sifatida turibdi
Svop sekin to'lyaptiXotira yetishmayapti
si/so doim nolga teng emasServer sekinlashadi - jiddiy muammo
Svop ishlatilgani emas, almashinuv tezligi muhim

free da svop 2 GB ishlatilgan bo'lishi mumkin, lekin server tez ishlayveradi - chunki u yerda uzoq vaqt ishlatilmagan sahifalar yotibdi.

Haqiqiy muammo - doimiy almashinuv (swap thrashing): sahifalar diskka yozilib, darhol qayta o'qiladi.

Buni vmstat ko'rsatadi:

Terminal
vmstat 1 5

si (swap in) va so (swap out) ustunlariga qarang. Ular doimiy nolga teng bo'lmasa - xotira qo'shish yoki ilovani cheklash vaqti keldi.

Serverda svopni butunlay o'chirish ham yaxshi g'oya emas: svop bo'lmasa, xotira tugaganda yadro darhol jarayon o'ldirishga o'tadi.

Terminal
vmstat 1 2 | sed -n 2p | tr -s ' ' | tr ' ' '
' | grep -x -e si -e so | wc -l
Natija
2

si va so ustunlari mavjud - aynan shularni kuzatasiz.

OOM Killer #

Xotira butunlay tugaganda yadro eng "yaroqsiz" jarayonni o'ldiradi.

Terminal
dmesg 2>/dev/null | grep -ci 'out of memory' || true
Natija
0
OOM Killer odatda MySQL ni tanlaydi

Yadro ballni jarayonning xotira hajmiga qarab hisoblaydi. Serverda eng ko'p xotira egallagan jarayon - odatda ma'lumotlar bazasi.

Natijada: xotira tugaydi → MySQL o'ldiriladi → sayt ishlamaydi → jurnal esa "MySQL server has gone away" deydi va siz sababni ma'lumotlar bazasida qidirasiz.

To'g'ri joyda qidirish:

BuyruqNima ko'rsatadi
dmesg -T | grep -i oomYadro qachon va kimni o'ldirgan
journalctl -k | grep -i oomXuddi shu, systemd orqali
cat /proc/PID/oom_scoreJarayonning "xavf balli"

Himoyalash:

ChoraBuyruq
Muhim jarayonni himoyalashsystemd da OOMScoreAdjust=-500
Ilovani cheklashsystemd da MemoryMax=512M
Svop qo'shishVaqt yutadi, muammoni hal qilmaydi

Ikkinchisi eng to'g'ri yechim: ilova o'z chegarasida o'ldiriladi va ma'lumotlar bazasiga tegilmaydi (12-bo'lim).

top chiqishini o'qish #

top ning protsessor qatori shunday ko'rinadi:

Natija
%Cpu(s):  3.4 us,  1.2 sy,  0.0 ni, 94.9 id,  0.3 wa,  0.0 hi,  0.2 si,  0.0 st
KodMa'noYuqori bo'lsa
usFoydalanuvchi kodiIlova ko'p hisoblayapti
syYadro kodiKo'p tizim chaqiruvi yoki kontekst almashinuvi
niUstuvorligi o'zgartirilganOdatda muhim emas
idBo'shYuqori bo'lishi yaxshi
waDisk kutilmoqdaDisk to'siq bo'lyapti
siYumshoq uzilishlarTarmoq trafigi katta
stO'g'irlangan vaqtGipervizor sizga vaqt bermayapti
st (steal time) - bulut serverida eng qimmatli raqam

st - gipervizor sizning virtual mashinangizga protsessor bermagan vaqt. Ya'ni qo'shni ijarachilar sizning resursingizni yeyapti.

st qiymatiXulosa
0-2%Normal
5-10%Sezilarli - server "sababsiz" sekin
10% dan yuqoriProvayderga murojaat qiling yoki tarifni o'zgartiring

Buni bilish muhim, chunki st yuqori bo'lganda sizning kodingizni optimallashtirish hech qanday foyda bermaydi - muammo sizning serveringizda emas.

Arzon VPS tariflarida bu ko'p uchraydi. top ni ochib, bir necha daqiqa kuzating.

Interaktiv vositalar #

VositaKuchli tomoni
topHamma joyda bor
htopRangli, sichqoncha, daraxt ko'rinishi
vmstat 1Xotira va svop dinamikasi
iostat -x 1Disk batafsil
pidstat 1Jarayon bo'yicha resurs
sarTarixiy ma'lumot
sar - "kecha soat 3 da nima bo'lgan?"

top faqat hozirni ko'rsatadi. Muammo tunda bo'lib o'tgan bo'lsa, u foydasiz.

sysstat paketi har 10 daqiqada holatni yozib boradi:

BuyruqNima ko'rsatadi
sar -uBugungi protsessor tarixi
sar -rXotira tarixi
sar -dDisk tarixi
sar -n DEVTarmoq tarixi
sar -f /var/log/sysstat/sa1010-kundagi ma'lumot

Bu paketni serverda birinchi kuni o'rnating:

Terminal
sudo apt install sysstat
sudo sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
sudo systemctl enable --now sysstat

Muammo yuz berganda tarix bo'lmasa, siz faqat taxmin qila olasiz.

Cheklovlar (ulimit) #

Terminal
ulimit -n
ulimit -u > /dev/null && echo "jarayon chegarasi ham bor"
Natija
10240
jarayon chegarasi ham bor

Jarayonning haqiqiy chegarasi esa /proc da yotadi - ulimit faqat joriy qobiqni ko'rsatadi:

Terminal
sleep 60 &
PID=$!
grep -c 'Max open files' /proc/"$PID"/limits
kill "$PID"
Natija
1

Xizmat "Too many open files" bersa, uning chegarasini aynan shu yerdan tekshiring - taxmin qilmang.

ChegaraBayroqNima uchun muhim
Ochiq fayllar-nHar tarmoq ulanishi ham fayl
Jarayonlar-uFork bombasidan himoya
Xotira-vVirtual xotira hajmi
Yadro fayli-cHalokat dampi hajmi
"Too many open files" - xotira emas, chegara

Yuklama ortganda Nginx yoki ma'lumotlar bazasi shunday xato bera boshlaydi:

Natija
accept4() failed (24: Too many open files)

Bu xotira tugagani emas - ochiq fayl deskriptorlari chegarasi tugagani. Har HTTP ulanishi bitta deskriptor egallaydi, standart 1024 esa band serverga yetmaydi.

Chegarani ko'rish va oshirish:

VazifaYo'l
Joriy sessiyaulimit -n 65535
Foydalanuvchi uchun doimiy/etc/security/limits.conf
Xizmat uchunsystemd da LimitNOFILE=65535
Jarayonning haqiqiy chegarasicat /proc/PID/limits

Uchinchisi eng muhim: systemd xizmatlari /etc/security/limits.conf ni o'qimaydi. Nginx chegarasini u yerda oshirsangiz - hech nima o'zgarmaydi.

Tekshiruvning to'g'ri tartibi #

QadamBuyruqNimaga qaraysiz
1uptimeYuklama / nproc nisbati
2free -havailable ustuni
3top%wa va %st
4df -h va df -iDisk va inode
5dmesg -T | tailOOM, disk xatolari
6journalctl -p err -n 50Xizmat xatolari
7ss -sUlanishlar soni
Birinchi tekshirish - disk to'lganmi

Tajriba shuni ko'rsatadiki, "server ishlamayapti" holatlarining katta qismi oddiy sabab bilan: disk to'lgan.

Jurnal yozilmaydi, ma'lumotlar bazasi vaqtinchalik fayl yarata olmaydi, sessiya saqlanmaydi - va hamma narsa tushunarsiz xatolar bera boshlaydi.

df -h bir soniya oladi. Uni birinchi bajaring.

Va df -i ni ham unutmang: inode tugashi mumkin, disk bo'sh bo'lsa ham (14-bo'lim).

Amaliy topshiriq
  1. /proc/loadavg ning beshta maydonini nomlang.
  2. Yuklamani nproc ga bo'ling va xulosa chiqaring.
  3. Uch raqamning tartibidan tendensiyani aniqlang.
  4. free -h da nima uchun available ustuni muhimligini tushuntiring.
  5. /proc/meminfo dan ishlatilgan xotira foizini hisoblang.
  6. vmstat 1 5 da si/so ustunlarini kuzating.
  7. dmesg da OOM yozuvlarini qidiring.
  8. top ning %wa va %st ustunlarini tushuntiring.
  9. ulimit -n ni ko'ring va nima uchun oshirilishi kerakligini ayting.
  10. Yetti qadamli tekshiruvni boshdan-oxir bajaring.

Xulosa #

  • Yuklama - foiz emas, navbatdagi jarayonlar soni; nproc ga bo'ling.
  • Linuxda yuklamaga D holatidagi (disk kutayotgan) jarayonlar ham kiradi.
  • Uch raqamning tartibi tendensiyani ko'rsatadi.
  • free ustunidagi free emas, available ahamiyatli.
  • Bo'sh xotira disk keshiga ketadi - bu ataylab shunday.
  • Svop ishlatilgani emas, si/so almashinuv tezligi muhim.
  • OOM Killer odatda ma'lumotlar bazasini tanlaydi - MemoryMax bilan cheklang.
  • %st yuqori bo'lsa, muammo sizning serveringizda emas.
  • sar bo'lmasa, kechagi muammoni tekshirib bo'lmaydi - uni oldindan o'rnating.
  • "Too many open files" - xotira emas, LimitNOFILE.

Keyingi bo'limda systemd ni ko'ramiz: ilovani xizmatga aylantirish, avtomatik qayta ishga tushirish va resurs cheklovlari.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.