Tarkibga o'tish

Swap fayl va partition

Oldingi maqolalarda disklar qanday tashkil qilinishi (RAID, LVM, LUKS, fayl tizimlari) ko'rib chiqildi — bularning hammasi doimiy ma’lumotlarni saqlashga xizmat qiladi. Swap esa boshqa maqsadga xizmat qiladi: u fayl tizimidan tashqarida turadi va RAM (fizik xotira) yetishmaganda tizimga "zaxira xotira" beradi. RAM to'lganda kernel kamroq ishlatiladigan xotira sahifalarini diskka (swap’ga) chiqarib, faol jarayonlar uchun RAM’ni bo'shatadi.

Swap Fayl tizimi turlari dan keyin keladi, chunki swap ham disk maydoni — bo'lim yoki oddiy fayl ko'rinishida — va uni sozlash mount va umount hamda fstab maqolalarida ko'rib chiqiladigan mexanizmlar bilan chambarchas bog'liq. Farqi shundaki, swap fayl tizimi emas: u fayllarni saqlamaydi, faqat xotira sahifalarini vaqtincha ushlab turadi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • swap nega mavjudligini va zamonaviy tizimlarda uning roli qanday o'zgarganini tushuntirish;
  • swap partition va swap faylni farqlash va qachon qaysi birini tanlashni bilish;
  • mkswap va swapon/swapoff bilan swap yaratish va boshqarish;
  • swap’ni /etc/fstab orqali doimiy qilish;
  • swappiness parametrini tushunish va uni muayyan vaziyatga moslab sozlash;
  • swap va OOM killer o'rtasidagi munosabatni tushuntirish va konteyner/bulut muhitida swap kerakmi-yo'qmi, baholash.

Swap nega kerak

Kernelning xotira menejeri har bir jarayonning xotira sahifalarini uzluksiz kuzatib boradi. RAM yetarli bo'lmaganda kernel bir muddat ishlatilmagan sahifalarni diskdagi swap maydoniga chiqaradi ("swap out") va faol ishlatilayotgan jarayonlar uchun RAM’ni bo'shatadi. Keyinroq sahifa yana kerak bo'lganda u RAM’ga qaytariladi ("swap in").

Swap quyidagi vaziyatlarda foydali:

  • vaqtinchalik RAM yetishmovchiligi — masalan, vaqti-vaqti bilan ishlaydigan og'ir jarayon (zaxira nusxa, kompilyatsiya) uchun qo'shimcha zaxira;
  • hibernation — tizim butun RAM holatini diskka yozadi va keyinroq tiklaydi; bu faqat swap orqali mumkin;
  • OOM killer’dan qochish — swap bo'lmasa, RAM tugashi bilan kernel to'g'ridan-to'g'ri jarayonlarni majburan o'ldirishga (OOM kill) o'tadi; swap qo'shimcha vaqt beradi va bu o'tishni yumshatadi.

Info

Swap RAM’ning to'liq o'rnini bosa olmaydi — disk RAM’dan minglab marta sekinroq. Swap uzluksiz, og'ir foydalanish uchun emas, vaqti-vaqti bilan bo'ladigan xotira bosimi uchun mo'ljallangan. Agar tizim doimiy ravishda swap’ga tayansa ("thrashing" deb ataladi), unumdorlik keskin pasayadi — bunday holatda yechim ko'proq swap emas, ko'proq RAM.

Swap partition va swap fayl

Swap ikki shaklda bo'lishi mumkin: alohida disk bo'limi (swap partition) yoki mavjud fayl tizimi ichidagi maxsus fayl (swap fayl).

Mezon Swap partition Swap fayl
Yaratish Diskni qayta bo'limlashni talab qiladi Mavjud fayl tizimida oddiy fayl sifatida yaratiladi
Hajmni o'zgartirish Qiyin, odatda qayta bo'limlash kerak Oson — faylni o'chirib, boshqa hajmda qayta yarating
Unumdorlik Amalda bir xil (zamonaviy kernellarda farq sezilmas darajada) Amalda bir xil
Moslashuvchanlik Past Yuqori — masalan, bulut VM disk hajmini o'zgartirmasdan swap qo'shishi/olib tashlashi mumkin
Sukut bo'yicha tanlov An’anaviy server o'rnatmalari Zamonaviy distributivlar (Ubuntu 22.04+ va boshqalar) sukut bo'yicha shundan foydalanadi

Zamonaviy Linux kernelida ikkalasi o'rtasidagi unumdorlik farqi amalda yo'q (btrfs kabi ayrim fayl tizimlari swap faylni tayyorlashga maxsus talablar qo'yadi). Shu sababli ko'p zamonaviy distributivlar o'rnatuvchilari moslashuvchanligi uchun sukut bo'yicha swap fayldan foydalanadi.

Swap partition yaratish

Faraz qilaylik, /dev/sdb1 — swap uchun ajratilgan bo'sh bo'lim.

Danger

mkswap diskdagi mavjud ma’lumotlarni o'chiradi (u bo'lim sarlavhasini swap formatiga o'tkazadi). Bu buyruqni faqat bo'sh, ishlatilmayotgan bo'limda, ideal holda o'chirib tashlasa bo'ladigan sinov VM’ida ishga tushiring. Buni production diskka qo'llashdan oldin qurilma nomini qayta tekshiring (lsblk, blkid).

1. Tekshiruv (faqat o'qish)

lsblk
sudo blkid /dev/sdb1

Bo'limda hali swap yoki boshqa fayl tizimi imzosi yo'qligini tasdiqlang.

2. Uni swap sifatida tayyorlash

sudo mkswap /dev/sdb1

Bu bo'limni swap formatiga o'tkazadi va unga UUID beradi.

3. Uni faollashtirish

sudo swapon /dev/sdb1

Tekshirish:

swapon --show
free -h

swapon --show faol swap qurilmalarini ro'yxatlaydi, free -h esa umumiy va ishlatilgan swap’ni ko'rsatadi.

Swap fayl yaratish

Swap fayl uchun disk qayta bo'limlanmaydi — u mavjud fayl tizimi ichida oddiy fayl sifatida yaratiladi.

1. Faylni yarating va hajmini belgilang

sudo fallocate -l 4G /swapfile

fallocate diskda so'ralgan hajmni tezda ajratadi. Agar fayl tizimi fallocate ni qo'llab-quvvatlamasa (masalan, ayrim btrfs konfiguratsiyalarida), muqobil — dd:

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

2. Ruxsatlarni cheklang

sudo chmod 600 /swapfile

Swap fayl hech qachon boshqa foydalanuvchilar o'qiy oladigan bo'lmasligi kerak — aks holda xotiradagi maxfiy ma’lumotlarni (masalan, parollarni) diskdagi swap fayl orqali qayta o'qish mumkin bo'lib qoladi.

3. Uni swap sifatida tayyorlang va faollashtiring

sudo mkswap /swapfile
sudo swapon /swapfile

Tekshirish:

swapon --show
free -h

Swap’ni o'chirish

sudo swapoff /dev/sdb1

yoki swap fayl uchun:

sudo swapoff /swapfile
sudo rm /swapfile

Warning

swapoff faol ishlatilayotgan swap sahifalarini RAM’ga qaytarishga urinadi. Agar RAM’da yetarli bo'sh joy bo'lmasa, swapoff muvaffaqiyatsiz bo'lishi yoki tizim vaqtincha sekinlashishi mumkin. Swap’ni o'chirishdan oldin free -h bilan qancha swap ishlatilayotganini va RAM’da unga joy borligini tekshiring.

/etc/fstab orqali doimiy qilish

swapon bilan qo'lda faollashtirilgan swap qayta yuklashdan keyin yo'qoladi. Uni doimiy qilish uchun /etc/fstab ga yozuv qo'shiladi.

Swap partition uchun avval uning UUID’sini toping:

sudo blkid /dev/sdb1

/etc/fstab yozuvi:

UUID=1234-5678-...  none  swap  sw  0  0

Swap fayl uchun UUID kerak emas — fayl yo'li to'g'ridan-to'g'ri ishlatiladi:

/swapfile  none  swap  sw  0  0

Yozuv qo'shilgach, uni qayta yuklamasdan tekshirish uchun:

sudo swapon -a
swapon --show

swapon -a /etc/fstab dagi har bir swap yozuvini faollashtiradi — bu fstab yozuvi to'g'ri ekanini qayta yuklamasdan tasdiqlash imkonini beradi. fstab formati va uning mount/umount bilan aloqasi fstab va mount va umount maqolalarida chuqur ko'rib chiqiladi.

swappiness: kernel swap’dan qachon foydalanishini boshqarish

swappiness kernelga swap’dan qanchalik ishtiyoq bilan foydalanishni 0 dan 100 gacha shkalada aytadi:

  • 0 ga yaqin — kernel iloji boricha swap’dan qochadi va RAM deyarli to'lguncha faqat undan foydalanadi;
  • 100 ga yaqin — kernel RAM biroz band bo'lishi bilanoq swap’dan faol foydalanishga moyil bo'ladi.

Joriy qiymatni tekshirish:

cat /proc/sys/vm/swappiness

Ko'p distributivlarda sukut bo'yicha qiymat — 60. Uni vaqtincha (qayta yuklashgacha) o'zgartirish:

sudo sysctl vm.swappiness=10

Doimiy o'zgartirish uchun uni /etc/sysctl.conf ga yoki /etc/sysctl.d/ ostidagi faylga qo'shing:

vm.swappiness=10

Qaysi qiymat qaysi muhitga mos keladi:

Muhit Tavsiya etilgan swappiness Sababi
Ma’lumotlar bazasi serveri Past (1–10) Ma’lumotlar bazasi o'z xotirasini o'zi boshqaradi; swap kechikish qo'shadi
Desktop / kundalik ish stantsiyasi O'rtacha (30–60) Muvozanat — kam ishlatiladigan dasturlar swap’ga ketadi, tez-tez ishlatiladiganlari RAM’da qoladi
Swap’ga kamdan-kam muhtoj bo'ladigan, xotirasi katta server Past (10–20) Kechikishni kamaytiradi, swap faqat favqulodda holatlar uchun qoldiriladi

Info

swappiness=0 swap’ni butunlay o'chirmaydi — u faqat kernelni swap’ga oxirgi chora sifatida murojaat qilishga undaydi. Swap’ni butunlay o'chiradigan narsa — swapoff.

Siqilgan swap: zram va zswap

Zamonaviy tizimlar diskdagi swap’dan butunlay qochib, buning o'rniga xotirani siqishga tobora ko'proq murojaat qilmoqda. Bu konteynerlar, VM’lar va RAM’i kam mashinalar uchun tez-tez uchraydi.

  • zram RAM ichida siqilgan block qurilma yaratadi va undan swap sifatida foydalanadi. Sahifalar diskka yozilmaydi, siqiladi (odatda 2–3 barobar), shuning uchun "swap qilish" xotira tezligida qoladi. Fedora va Ubuntu endi ko'p o'rnatmalarda uni sukut bo'yicha yoqadi. Bu haqiqiy swap — swapon --show uni ro'yxatlaydi — lekin disk emas, RAM bilan ta’minlangan.

    sudo modprobe zram
    zramctl                      # inspect zram devices
    

    Amalda u qo'lda emas, deklarativ tarzda sozlanadi (systemd zram-generator yoki zram-tools paketi).

  • zswap boshqacha: u haqiqiy diskdagi swap oldidagi siqilgan kesh. Sahifalar avval siqilgan RAM pool’iga tushadi; faqat shu pool to'lgandagina eng sovuq sahifalar haqiqiy swap qurilmasiga yoziladi. Shunday qilib zswap diskdagi swap faylni to'ldiradi, zram esa odatda uning o'rnini bosadi.

Info

zram I/O (diskka yozish) o'rniga CPU’dan (siqish) foydalanadi — RAM to'siq bo'lgan va diskdagi swap sekin yoki tavsiya etilmaydigan bulut VM’lari va konteynerlar uchun bu juda yaxshi kelishuv. U hibernation uchun ishlamaydi, chunki hibernation baribir kamida RAM hajmidagi haqiqiy diskdagi swap maydonini talab qiladi.

Swap ustuvorligi

Bir vaqtda bir nechta swap maydoni faol bo'lishi mumkin va pri parametri ulardan qaysi tartibda foydalanishni boshqaradi — avval yuqoriroq ustuvorlik, teng ustuvorliklar esa parallel ishlatiladi:

/dev/zram0   none  swap  sw,pri=100  0  0
/swapfile    none  swap  sw,pri=10   0  0

Bu tez, siqilgan zram swap’ni afzal ko'rish va sekinroq diskdagi swap faylga faqat haqiqiy bosim ostida o'tishning standart usuli. Natijani swapon --show bilan tasdiqlang — uning PRIO ustuni shu qiymatlarni aks ettiradi.

Swap va OOM killer

Agar RAM ham, swap ham to'lsa, kernel "Out Of Memory" (OOM) holatiga o'tadi va OOM killer’ni ishga tushiradi — tizim butunlay qulab tushmasligi uchun u eng ko'p xotira ishlatayotgan yoki eng "arzon" (oom_score i eng past) jarayonni majburan tugatadi.

Swap mavjudligi OOM killer’ni kechiktiradi va uning ta’sirini yumshatadi: RAM to'lganda jarayon darhol o'ldirilmaydi — avval kamroq faol sahifalar swap’ga chiqariladi. Swap bo'lmasa yoki juda kam bo'lsa, RAM tugashi bilanoq OOM killer keskin ishga tushadi — bu, ayniqsa qisqa muddatli xotira sakrashlarida (masalan, build jarayonida), kutilmaganda jarayonlarning o'ldirilishiga sabab bo'lishi mumkin.

dmesg | grep -i "out of memory"
journalctl -k | grep -i "oom"

Bu buyruqlar log yozuvlaridan OOM killer ishga tushgan holatlarni topishga yordam beradi.

Konteyner yoki bulut VM’ida swap kerakmi

Swap har doim ham kerak emas — to'g'ri qaror muhitga bog'liq:

  • Konteynerlar (Docker, Kubernetes) — odatda swap o'chirilgan bo'ladi yoki resurs cheklovlari (memory limit) orqali boshqariladi. Masalan, Kubernetes uzoq vaqt node’larda swap’ni umuman qo'llab-quvvatlamagan, chunki swap yoqilganda u resurslarni hisobga olishni buzib qo'yishi mumkin (yaqinda cheklangan qo'llab-quvvatlash qo'shilgan, lekin production’da undan ehtiyotkorlik bilan foydalaniladi).
  • Bulut VM’lari (masalan, kichikroq instance turlari) — RAM cheklangan bo'lishi mumkin, shuning uchun swap fayl qo'shish arzon va tezkor yechim; ko'p provayderlar buni tavsiya qiladi.
  • Ma’lumotlar bazasi serverlari — ko'pincha kam yoki minimal swap bilan ishlaydi, chunki ma’lumotlar bazasi o'z xotirasini o'zi boshqaradi va disk kechikishi ma’lumotlar bazasi unumdorligiga zarar yetkazadi.
  • Hibernation kerak bo'lgan noutbuk/desktop — swap (kamida RAM hajmida) shart, chunki hibernation butun RAM holatini swap’ga yozadi.

Amaliy vaziyat: mavjud VM’ga swap fayl qo'shish

Muammo: production bulut VM’ida xotira yetishmasligi sababli jarayonlar vaqti-vaqti bilan OOM killer tomonidan o'ldirilmoqda, lekin diskni qayta bo'limlash imkoni yo'q (bulut provayderi bo'lim hajmini o'zgartirishni talab qiladi, bu esa uzilishga sabab bo'ladi).

1. Joriy holatni tekshiring:

free -h
swapon --show
dmesg | grep -i "out of memory"

Bu swap umuman yo'qligini va yaqinda OOM killer ishga tushganini tasdiqlaydi.

2. Diskda bo'sh joy borligini tekshiring:

df -h /

3. 2 GiB hajmli swap fayl yarating:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

4. Tekshiring:

free -h
swapon --show

5. Doimiy qiling:

/swapfile  none  swap  sw  0  0

Bu qator /etc/fstab oxiriga qo'shiladi.

6. swappiness ni server yuklamasiga moslang:

sudo sysctl vm.swappiness=10

Bu qiymat doimiy ravishda /etc/sysctl.d/99-swappiness.conf ga yoziladi.

Natija: VM diskni qayta bo'limlamasdan qo'shimcha 2 GiB zaxira xotiraga ega bo'ldi. swappiness=10 bilan kernel swap’dan faqat haqiqatan kerak bo'lganda foydalanadi va shu bilan birga vaqtinchalik xotira sakrashlarida OOM killer ishga tushishi ehtimolini kamaytiradi.

Xulosa: swap fayl qayta bo'limlashsiz tezkor, ortga qaytariladigan yechim beradi — muammo yuzaga kelsa, uni swapoff va rm bilan osongina bekor qilish mumkin. Lekin bu doimiy yechim emas: agar xotira doimiy yetishmasa, haqiqiy yechim — ko'proq RAM yoki yuklamani optimallashtirish.

Keng tarqalgan xatolar

Swap faylni hamma o'qiy oladigan qilib qoldirish

Agar chmod 600 /swapfile qo'llanmasa, boshqa foydalanuvchilar xotiradagi maxfiy ma’lumotlarni (parollar, kalitlar) o'z ichiga olishi mumkin bo'lgan swap faylni o'qiy olishi mumkin.

swapon dan keyin fstab ni unutish

swapon bilan qo'lda faollashtirilgan swap keyingi qayta yuklashda yo'qoladi — uning ishlayotganini ko'rib, muammo hal bo'ldi deb hisoblash xato. U saqlanib qolishi uchun fstab yozuvi shart.

Swap’ni RAM yetishmovchiligining doimiy yechimi deb hisoblash

Swap — vaqtinchalik zaxira; unga uzluksiz va og'ir tayanish tizim unumdorligini keskin pasaytiradi (thrashing). Doimiy yuqori swap ishlatilishi ko'proq swap qo'shish uchun sabab emas, ko'proq RAM kerakligining belgisi.

swappiness ni oldindan tekshirmasdan o'zgartirish

Ma’lumotlar bazasi kabi sezgir xizmatda swappiness ni ehtiyotsizlik bilan yuqori qo'yish kutilmagan kechikishlarga olib kelishi mumkin. Uni monitoring bilan birga, bosqichma-bosqich o'zgartirish tavsiya etiladi.

Mashqlar

  1. O'chirib tashlasa bo'ladigan VM’da 1 GiB hajmli swap fayl yarating, uni swapon --show va free -h bilan tasdiqlang, so'ng swapoff bilan o'chiring.
  2. /etc/fstab ga swap fayl yozuvini qo'shing va uni qayta yuklamasdan swapon -a bilan tekshiring.
  3. vm.swappiness ni avval 10 ga, so'ng 80 ga o'zgartiring va farqni /proc/sys/vm/swappiness orqali kuzating (haqiqiy ta’sirni ko'rish uchun xotira sarflaydigan sinov dasturi kerak bo'lishi mumkin).
  4. dmesg yoki journalctl -k log'laridan OOM killer ishga tushgan holatlarni (agar bo'lsa) qidiring va qaysi jarayon tugatilganini aniqlang.

Mashqni bajardim deyish uchun: server roli (ma’lumotlar bazasi, desktop, hibernation kerak bo'lgan bulut VM) berilganda mos swappiness qiymatini tavsiya qila olishingiz va uni asoslab bera olishingiz kerak.

Xulosa

Swap RAM yetishmaganda vaqtinchalik zaxira xotirani ta’minlaydi — u bo'lim yoki fayl bo'lishi mumkin, zamonaviy tizimlarda esa moslashuvchanligi uchun ko'proq swap fayl tavsiya etiladi. U mkswap bilan tayyorlanadi, swapon/swapoff bilan boshqariladi va /etc/fstab orqali doimiy qilinadi. swappiness parametri kernelga swap’dan qachon foydalanishni aytadi, swap’ning o'zi esa OOM killer’ni kechiktiradi va uning ta’sirini yumshatadi — lekin konteynerlarda va ayrim ma’lumotlar bazasi muhitlarida u ataylab o'chiriladi yoki minimal darajada saqlanadi. Bu qatlamlarning hammasi (RAID, LVM, LUKS, fayl tizimi, swap) boot paytida aslida qanday mount qilinishi va avtomatik ulanishi mount va umount hamda fstab maqolalarida davom etadi.

Manbalar