14-bo‘lim
Resurs cheklovlari
Xotira va CPU chegaralari, OOM killer, PID chegarasi va faqat o'qish uchun fayl tizimi.
Ushbu bo‘lim mundarijasi
13-bobda docker stats chegarasiz konteyner uchun butun host
xotirasini ko'rsatganini payqadik. Bu shunchaki ko'rsatuv emas -
konteyner haqiqatan hammasini olishi mumkin.
Bitta xato ketgan jarayon butun serverni to'xtatib qo'yishi uchun shu yetarli.
Chegarasiz holat #
Konteyner ichidan cgroup fayllariga qaraymiz:
docker run --rm alpine:3.21 sh -c \
'echo "xotira: $(cat /sys/fs/cgroup/memory.max)"
echo "CPU : $(cat /sys/fs/cgroup/cpu.max)"'
xotira: max
CPU : max 100000
Ikkalasida ham max - ya'ni chegara yo'q.
Xotira chegarasi #
docker run --rm -m 128m alpine:3.21 cat /sys/fs/cgroup/memory.max
134217728
134217728 bayt - aynan 128 MiB. Chegara yadro darajasida o'rnatildi.
CPU chegarasi #
docker run --rm --cpus 0.5 alpine:3.21 cat /sys/fs/cgroup/cpu.max
50000 100000
Ikki son: har 100000 mikrosekundlik davrda 50000 mikrosekund CPU vaqti. Ya'ni yarim yadro.
Bu haqiqatan sekinlashtiradi. Bir xil hisoblash sikli mening kompyuterimda:
| Chegara | Vaqt |
|---|---|
| Chegarasiz | 6.4 soniya |
--cpus 0.25 | 26.5 soniya |
To'rt barobardan ko'proq - kutilganidek.
Chegara oshsa nima bo'ladi? #
32 MiB chegarali konteynerga 200 MiB yozdiramiz:
docker run --name oom -m 32m alpine:3.21 \
sh -c 'dd if=/dev/zero of=/dev/shm/katta bs=1M count=200' >/dev/null 2>&1
echo "chiqish kodi: $(docker inspect oom -f '{{.State.ExitCode}}')"
echo "OOMKilled : $(docker inspect oom -f '{{.State.OOMKilled}}')"
chiqish kodi: 137
OOMKilled : true
137 yana paydo bo'ldi - lekin bu safar sabab boshqa.
| 137 ning sababi | Qanday ajratiladi |
|---|---|
docker stop SIGKILL yubordi | OOMKilled: false |
| Yadro xotira uchun o'ldirdi | OOMKilled: **true** |
137 = 128 + 9, ya'ni SIGKILL. Ikkala holatda ham jarayon
majburan o'ldirilgan, lekin sabab butunlay boshqa - va
OOMKilled maydonisiz ularni farqlab bo'lmaydi.
Birinchi tekshiradigan narsangiz - shu:
docker inspect <konteyner> -f '{{.State.OOMKilled}}'
true bo'lsa, ilova xotira chegarasiga sig'mayapti. Chegarani
oshirish yoki ilovadagi xotira sizishini tuzatish kerak.
Jurnalda odatda hech qanday xato bo'lmaydi: jarayon SIGKILL bilan o'ladi va oxirgi so'zini ayta olmaydi.
Chegara stats da ham ko'rinadi #
docker run -d --name cheklangan -m 256m --cpus 0.5 \
alpine:3.21 sleep 120 >/dev/null
docker inspect cheklangan \
-f 'Xotira : {{.HostConfig.Memory}} bayt
NanoCPU: {{.HostConfig.NanoCpus}}'
Xotira : 268435456 bayt
NanoCPU: 500000000
Endi docker stats da limit haqiqiy qiymatni ko'rsatadi -
13-bobdagi kabi butun host xotirasini emas.
PID chegarasi #
Fork bombasi yoki nazoratdan chiqqan sikl minglab jarayon yaratishi mumkin:
docker run --rm --pids-limit 10 alpine:3.21 sh -c \
'for i in $(seq 1 30); do sleep 5 & done' 2>&1 | head -1
sh: can't fork: Resource temporarily unavailable
O'ninchi jarayondan keyin yadro fork ga ruxsat bermadi.
Konteyner ichida muammo bor, lekin host butunlay sog'lom.
Faqat o'qish uchun fayl tizimi #
docker run --rm --read-only alpine:3.21 sh -c 'touch /yangi' 2>&1 | head -1
touch: /yangi: Read-only file system
Ilova hech narsa yoza olmaydi. Vaqtinchalik fayl kerak bo'lsa, unga alohida joy beriladi:
docker run --rm --read-only --tmpfs /tmp alpine:3.21 \
sh -c 'touch /tmp/yangi && echo "tmp ga yozildi"'
tmp ga yozildi
--read-only - arzon va kuchli himoyaHujumchi kod bajarishga erishsa ham, u:
- Veb qobiq faylini yoza olmaydi
- Ikkilik fayllarni almashtira olmaydi
- Doimiylik uchun skript qoldira olmaydi
Narxi esa deyarli nol - faqat yoziladigan papkalarni aniqlab,
ularga tmpfs yoki hajm berish kerak.
15-bobda bu mavzuni davom ettiramiz.
Compose da #
services:
ilova:
image: dokon:1.0
read_only: true
tmpfs:
- /tmp
pids_limit: 200
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
memory: 128M
limits - maksimum, reservations esa rejalashtirish uchun
minimum.
Qaysi qiymatni tanlash? #
| Xizmat turi | Xotira | CPU |
|---|---|---|
| Kichik veb ilova | 256-512 MB | 0.5-1.0 |
| Baza (kichik) | 1-2 GB | 1.0-2.0 |
| Kesh (Redis) | Ma'lumot hajmi + 25% | 0.25-0.5 |
| Fon ishchisi | 256-512 MB | 0.5 |
| Teskari proksi | 64-128 MB | 0.25-0.5 |
Bular boshlang'ich nuqta. To'g'ri yo'l - o'lchash:
- Chegarasiz ishga tushiring
- Bir necha kun
docker statsbilan kuzating - Eng yuqori qiymatga 50% zaxira qo'shib chegara qo'ying
- OOM bo'lsa - oshiring, uzoq vaqt bo'sh tursa - kamaytiring
JVM, Node va PostgreSQL o'z xotira sozlamalariga ega. Konteyner chegarasi ulardan kichik bo'lsa, ilova OOM bilan o'ladi.
Masalan JVM ga -Xmx1g berib, konteynerga -m 512m qo'ysangiz -
konteyner albatta o'ladi.
Zamonaviy ish vaqtlari cgroup chegarasini o'zi o'qiydi, lekin
buni tekshirib ko'ring: ilova ichida nproc va mavjud
xotirani chop etib solishtiring.
Xulosa #
- Chegarasiz konteyner hostning hamma xotirasi va CPU sini olishi mumkin.
- Chegara cgroup darajasida o'rnatiladi:
/sys/fs/cgroup/memory.maxvacpu.max. -m 128m→memory.max134217728 bayt;--cpus 0.5→cpu.max"50000 100000".- Xotira chegarasi oshsa, yadro jarayonni SIGKILL bilan o'ldiradi: chiqish kodi 137.
- Bu
docker stopdagi 137 danOOMKilled: truemaydoni bilan ajratiladi - takror qayta ishga tushayotgan konteynerda birinchi navbatda shuni tekshiring. - OOM o'limida jurnalda odatda hech qanday xato qolmaydi.
--pids-limitfork bombasidan himoya qiladi.--read-onlyjuda arzon va kuchli chora: hujumchi fayl qoldira olmaydi; yoziladigan joy--tmpfsbilan beriladi.- Compose da
deploy.resources.limitsishlatiladi. - Chegarani o'lchab tanlang; ilovaning o'z xotira sozlamasi konteyner chegarasidan kichik bo'lsin.
- Chegarasiz konteynerda
memory.maxvacpu.maxni o'qing. -m 128mbilan qayta o'qib, farqni ko'ring.--cpus 0.25bilan hisoblash siklini ishga tushirib, vaqtni o'lchang.- Chegaradan ko'p xotira so'rab, OOM ni keltirib chiqaring.
OOMKilledmaydonini tekshiring.--pids-limit 10bilan ko'p jarayon ochib ko'ring.--read-onlybilan yozishga urinib, xatoni o'qing.--tmpfs /tmpqo'shib, muammoni hal qiling.- Compose da resurs chegaralarini yozing.
- O'z ilovangizni bir kun kuzatib, mos chegarani hisoblang.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.