Disk va xotira — df, du, free, ncdu
Muammodan boshlaylik
Sayt to'satdan ishlamay qoldi. Loglarda:
ENOSPC: no space left on device
Disk to'lgan. MySQL yoza olmaydi, ilova log yoza olmaydi, hatto SSH orqali kirish ham qiyinlashadi. Nima diskni to'ldirdi? 40 GB qayerga ketdi?
Yoki: server sekin, top da xotira 95% band. Bu muammomi yoki normal holatmi? (Spoiler: ko'pincha — normal.)
df — disklar qanchalik to'la
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 40G 37G 1.2G 97% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/sdb1 100G 12G 83G 13% /mnt/data
-h— o'qiladigan birliklar (G, M)- Use% — eng muhim ustun. 90% dan oshsa — harakat qilish vaqti
- Mounted on — bu disk daraxtning qayerga ulangan (5-dars)
df -h / # faqat ildiz disk
df -h /var/lib/mysql # bu papka qaysi diskda va u qanchalik to'la
inode lar
Disk bo'sh, lekin baribir "No space left"?
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 2621440 2621440 0 100% /
inode — har bir fayl uchun yozuv. Ularning soni cheklangan. Millionlab kichik fayllar (sessiya fayllari, kesh) disk joyidan oldin inode larni tugatishi mumkin.
du — nima joy egallagan
du (disk usage) — papka va fayllar hajmi:
du -sh /var/log # bitta papka jami
du -sh * # joriy papkadagi har bir element
du -sh * | sort -h # hajm bo'yicha saralangan
du -h --max-depth=1 /var | sort -h
-s— faqat jami (ichini sanab chiqmasdan)-h— o'qiladigan birliklar--max-depth=1(yoki-d 1) — bir daraja chuqurlik
Diskni to'ldirgan narsani topish
Ildizdan boshlab, eng kattasiga "tushib" boring:
sudo du -h -d 1 / 2>/dev/null | sort -h | tail -5
1.2G /usr
2.1G /home
3.4G /opt
29G /var
37G /
sudo du -h -d 1 /var | sort -h | tail -5
...
2.8G /var/lib
26G /var/log
sudo du -h -d 1 /var/log | sort -h | tail -3
...
25G /var/log/dokon
Topildi: ilova loglari 25 GB. Yechim — logrotate (26-dars) va eski loglarni o'chirish.
ncdu — interaktiv
sudo apt install ncdu
sudo ncdu /
Papkalar hajm bo'yicha saralangan; strelkalar bilan ichiga kirasiz, d — o'chirish, q — chiqish. Yuqoridagi "tushish" jarayonini bir necha soniyada qiladi.
Tipik "disk yeyuvchilar"
| Joy | Nima | Yechim |
|---|---|---|
/var/log |
Aylantirilmagan loglar | logrotate, find -mtime +14 -delete |
| journald | systemd loglari | journalctl --vacuum-size=500M |
/var/lib/docker |
Eski image va konteynerlar | docker system prune -a |
/var/cache/apt |
Yuklab olingan paketlar | sudo apt clean |
node_modules |
Eski loyihalarda | find ... -name node_modules -prune -exec rm -rf {} + |
/tmp |
Unutilgan vaqtinchalik fayllar | Tekshirib o'chirish |
| Zaxira nusxalar | Server ichida to'planib qolgan | Eskilarini o'chirish, boshqa joyga ko'chirish |
O'chirildi, lekin joy bo'shamadi
Katta log faylni rm qildingiz — df hali ham 97% ko'rsatyapti. Nega? Ilova faylni hali ochiq tutib turibdi — fayl nomi yo'q, lekin ma'lumot diskda, toki jarayon uni yopmaguncha.
sudo lsof +L1 | grep deleted
Yechim: ilovani qayta ishga tushirish. Yoki keyingi safar — o'chirish o'rniga bo'shatish:
sudo truncate -s 0 /var/log/dokon/app.log # yoki: > app.log
Fayl qoladi, hajmi nolga tushadi, ilova yozishda davom etadi.
free — xotira
free -h
total used free shared buff/cache available
Mem: 3.8Gi 2.1Gi 312Mi 45Mi 1.4Gi 1.5Gi
Swap: 2.0Gi 68Mi 1.9Gi
[!INFO]
freeustuniga emas,availablega qarang. Linux bo'sh xotirani bekor qoldirmaydi — uni disk keshi (buff/cache) uchun ishlatadi. Dasturga xotira kerak bo'lsa, kesh darhol bo'shatiladi.available— dasturlar haqiqatda olishi mumkin bo'lgan xotira.
Yuqoridagi misolda: free 312 MB — qo'rqinchli ko'rinadi, lekin available 1.5 GB — hammasi joyida.
Swap
Swap — RAM tugaganda diskning bir qismi "qo'shimcha xotira" sifatida ishlatiladi. Diskdan 100–1000 barobar sekin.
- Bir oz swap ishlatilgan — normal
- Swap faol o'sib bormoqda, tizim sekin — RAM yetmaydi
Kichik VPS da (1–2 GB RAM) swap fayl yaratish — OOM killer dan himoya:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
/etc/fstab ga qo'shish — qayta yuklanganda ham saqlanishi uchun.
Kim xotirani ishlatyapti
ps aux --sort=-%mem | head -5
Monitoring uchun bir qator
echo "Disk: $(df -h / | awk 'NR==2 {print $5}') RAM: $(free -h | awk '/Mem/ {print $7}') bo'sh Yuklama: $(cut -d' ' -f1-3 /proc/loadavg)"
Disk: 47% RAM: 1.5Gi bo'sh Yuklama: 0.42 0.38 0.30
41-darsda shunga o'xshash tekshiruvni skriptga aylantirib, disk 90% dan oshganda ogohlantirish yuboramiz.
Nima uchun shunday?
Nima uchun Linux "bo'sh" xotirani kesh bilan to'ldiradi — bu xotirani "yeyish" emasmi?
Aksincha — bu xotiradan to'g'ri foydalanish. Ishlatilmagan RAM — behuda resurs: u hech qanday foyda keltirmaydi. Linux uni yaqinda o'qilgan fayllar (kod, kutubxonalar, baza sahifalari) uchun kesh sifatida ishlatadi — keyingi o'qish diskdan emas, xotiradan bo'ladi, minglab marta tezroq. Dasturga xotira kerak bo'lishi bilan kesh bir zumda bo'shatiladi. Shuning uchun Linux tajribali administratorlari "free past" deb xavotirlanmaydi — available va swap faolligiga qaraydi.
Xulosa
Eslab qoling:
df -h— disklar to'liqligi (Use%);df -i— inode lardu -sh * | sort -h— nima joy egallagan;du -h -d 1— bosqichma-bosqich tushishncdu— interaktiv tahlil- Tipik sabablar:
/var/log, journal, Docker, apt keshi - O'chirilgan, lekin ochiq fayl —
lsof +L1;truncate -s 0bilan bo'shatish free -h—availablega qarang,freega emas- Swap — kichik VPS uchun himoya; faol o'sishi — RAM yetmaydi
Keyingi dars
28-dars: Mashqlar — Node.js ilovani systemd xizmatiga aylantirish