Disk va xotira — df, du, free, ncdu

~10 daq · Linux · Jarayonlar va tizim

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] free ustuniga emas, available ga 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 lar
  • du -sh * | sort -h — nima joy egallagan; du -h -d 1 — bosqichma-bosqich tushish
  • ncdu — interaktiv tahlil
  • Tipik sabablar: /var/log, journal, Docker, apt keshi
  • O'chirilgan, lekin ochiq fayl — lsof +L1; truncate -s 0 bilan bo'shatish
  • free -h — available ga qarang, free ga emas
  • Swap — kichik VPS uchun himoya; faol o'sishi — RAM yetmaydi

Keyingi dars

28-dars: Mashqlar — Node.js ilovani systemd xizmatiga aylantirish