PostgreSQL uchun Linuxda xotiradan tashqari qotilni sozlash

PostgreSQL uchun Linuxda xotiradan tashqari qotilni sozlash

Linuxda ma'lumotlar bazasi serveri kutilmaganda yopilganda, siz sababni topishingiz kerak. Bir nechta sabablar bo'lishi mumkin. Masalan, SIGSEGV β€” backend serveridagi xato tufayli nosozlik. Ammo bu kamdan-kam uchraydi. Ko'pincha sizda diskda bo'sh joy yoki xotira tugaydi. Agar diskda bo'sh joy qolmagan bo'lsa, faqat bitta yo'l bor - bo'sh joy bo'shating va ma'lumotlar bazasini qayta ishga tushiring.

Xotirasiz qotil

Agar server yoki jarayon xotirasi tugasa, Linux ikkita yechim taklif qiladi: butun tizimni ishdan chiqarish yoki xotirani yemiruvchi jarayonni (ilovani) tugatish. Albatta, jarayonni to'xtatish va OSni ishdan chiqishdan saqlab qolish yaxshiroqdir. Xulosa qilib aytganda, Out-Of-Memory Killer bu yadroni ishdan chiqishidan saqlab qolish uchun dasturni o'ldiradigan jarayondir. Operatsion tizimning ishlashini ta'minlash uchun dasturni qurbon qiladi. Keling, avval OOM qanday ishlashini va uni qanday boshqarishni muhokama qilaylik, so'ngra OOM Killer qaysi dasturni tugatishni qanday hal qilishni ko'rib chiqaylik.

Linuxning asosiy vazifalaridan biri bu jarayonlar talab qilinganda xotirani ajratishdir. Odatda, jarayon yoki dastur operatsion tizimdan xotira talab qiladi, lekin undan to'liq foydalanmaydi. Agar operatsion tizim uni so'ragan, lekin undan foydalanishni rejalashtirmagan har bir kishiga xotirani bersa, tez orada xotira tugaydi va tizim ishlamay qoladi. Bunga yo'l qo'ymaslik uchun OS jarayon uchun xotirani zahiraga oladi, lekin aslida uni bo'shatmaydi. Xotira faqat jarayon uni ishlatmoqchi bo'lganda ajratiladi. Shunday bo'ladiki, OTda bo'sh xotira yo'q, lekin u xotirani jarayonga tayinlaydi va agar jarayon kerak bo'lsa, OT imkoni boricha uni ajratadi. Salbiy tomoni shundaki, ba'zida OS xotirani zahiraga oladi, lekin kerakli vaqtda bo'sh xotira yo'q va tizim ishdan chiqadi. OOM ushbu stsenariyda muhim rol o'ynaydi va yadroni vahima qo'zg'atmaslik uchun jarayonlarni tugatadi. PostgreSQL jarayoni tugatilishi kerak bo'lganda, jurnalda xabar paydo bo'ladi:

Out of Memory: Killed process 12345 (postgres).

Tizimda xotira kam bo'lsa va uni bo'shatib bo'lmasa, funksiya chaqiriladi out_of_memory. Ushbu bosqichda uning faqat bitta ishi bor - bir yoki bir nechta jarayonni bajarish. OOM-qotil jarayonni darhol tugatishi kerakmi yoki kutishi mumkinmi? Shubhasiz, out_of_memory chaqirilganda, bu kirish/chiqarish operatsiyasini kutish yoki diskdagi sahifalash bilan bog'liq. Shuning uchun, OOM qotili birinchi navbatda tekshiruvlarni amalga oshirishi va ularga asoslanib, jarayonni tugatish kerakligiga qaror qilishi kerak. Quyidagi barcha tekshiruvlar ijobiy bo'lsa, OOM jarayonni tugatadi.

Jarayonni tanlash

Xotira tugashi bilan funksiya chaqiriladi out_of_memory(). Uning funksiyasi bor select_bad_process(), bu funksiyadan baho oladi badness(). "Eng yomon" jarayon maqsadli bo'ladi. Funktsiya badness() muayyan qoidalarga muvofiq jarayonni tanlaydi.

  1. Yadro o'zi uchun minimal xotiraga muhtoj.
  2. Ko'p xotirani bo'shatish kerak.
  3. Kam xotira ishlatadigan jarayonlarni tugatishning hojati yo'q.
  4. Minimal jarayonlarni bajarish kerak.
  5. Foydalanuvchining o'zi tugatmoqchi bo'lgan jarayonlarni yakunlash imkoniyatini oshiradigan murakkab algoritmlar.

Ushbu barcha tekshiruvlarni tugatgandan so'ng, OOM ballni tekshiradi (oom_score). OOM tayinlaydi oom_score har bir jarayon va keyin bu qiymatni xotira miqdoriga ko'paytiradi. Kattaroq qiymatlarga ega bo'lgan jarayonlar OOM Killer qurboni bo'lish ehtimoli ko'proq. Ildiz foydalanuvchisi bilan bog'liq jarayonlar pastroq ballga ega va tugatishga majbur bo'lish ehtimoli kamroq.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Postgres jarayoni identifikatori 3813, shuning uchun boshqa qobiqda ushbu yadro parametri yordamida ball olish mumkin. oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Agar siz OOM-Killer jarayonini umuman o'ldirishini xohlamasangiz, yadroning yana bir varianti mavjud: oom_score_adj. Siz qadrlagan jarayonni yakunlash imkoniyatini kamaytirish uchun katta salbiy qiymat qo'shing.

sudo echo -100 > /proc/3813/oom_score_adj

Qiymat belgilash uchun oom_score_adj, xizmat ko'rsatish blokida OOMScoreAdjust ni o'rnating:

[Service]
OOMScoreAdjust=-1000

Yoki foydalaning oomprotect jamoada rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Jarayonni majburan tugatish

Bir yoki bir nechta jarayon allaqachon tanlangan bo'lsa, OOM-Killer funksiyani chaqiradi oom_kill_task(). Bu funksiya jarayonga tugatish signalini yuboradi. Xotira etishmovchiligi bo'lsa oom_kill() Jarayonga SIGKILL signalini yuborish uchun ushbu funktsiyani chaqiradi. Yadro jurnaliga xabar yoziladi.

Out of Memory: Killed process [pid] [name].

OOM-Killerni qanday boshqarish kerak

Linux-da siz OOM-Killer-ni yoqishingiz yoki o'chirib qo'yishingiz mumkin (garchi ikkinchisi tavsiya etilmaydi). Yoqish yoki o'chirish uchun parametrdan foydalaning vm.oom-kill. OOM-Killerni ish vaqtida yoqish uchun buyruqni bajaring sysctl.

sudo -s sysctl -w vm.oom-kill = 1

OOM-Killerni o'chirish uchun xuddi shu buyruqda 0 qiymatini belgilang:

sudo -s sysctl -w vm.oom-kill = 0

Ushbu buyruqning natijasi abadiy saqlanmaydi, faqat birinchi qayta ishga tushirilgunga qadar. Agar sizga ko'proq qat'iyat kerak bo'lsa, ushbu qatorni faylga qo'shing /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Yoqish va o'chirishning yana bir usuli o'zgaruvchini yozishdir panic_on_oom. Qiymat har doim tekshirilishi mumkin /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Agar siz qiymatni 0 ga qo'ysangiz, xotira tugashi bilan yadro vahima bo'lmaydi.

$ echo 0 > /proc/sys/vm/panic_on_oom

Agar siz qiymatni 1 ga qo'ysangiz, xotira tugashi bilan yadro vahima paydo bo'ladi.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer nafaqat yoqilishi va o'chirilishi mumkin. Biz allaqachon aytib o'tgan edikki, Linux jarayonlar uchun mavjud bo'lgandan ko'ra ko'proq xotirani uni ajratmasdan zahiralashi mumkin va bu xatti-harakat Linux yadrosi parametri tomonidan boshqariladi. Buning uchun o'zgaruvchi javobgardir vm.overcommit_memory.

Buning uchun quyidagi qiymatlarni belgilashingiz mumkin:

0: Yadroning o'zi juda ko'p xotirani zahiraga olishni hal qiladi. Bu Linuxning aksariyat versiyalarida sukut bo'yicha hisoblanadi.
1: Yadro har doim qo'shimcha xotirani saqlaydi. Bu xavfli, chunki xotira tugashi mumkin, chunki, ehtimol, bir kun jarayonlar buni talab qiladi.
2: yadro parametrda ko'rsatilganidan ko'proq xotirani zahiraga olmaydi overcommit_ratio.

Ushbu parametr yordamida siz ortiqcha zahiraga ruxsat berilgan xotira foizini belgilaysiz. Agar u uchun joy bo'lmasa, xotira ajratilmaydi va bron qilish rad etiladi. Bu PostgreSQL uchun tavsiya etilgan eng xavfsiz variant. OOM-Killerga boshqa element - o'zgaruvchi tomonidan boshqariladigan almashtirish qobiliyati ta'sir qiladi. cat /proc/sys/vm/swappiness. Ushbu qiymatlar yadroga peyjingni qanday boshqarish kerakligini aytadi. Qiymat qanchalik baland bo'lsa, OOM jarayonni to'xtatish ehtimoli shunchalik kam bo'ladi, lekin kiritish-chiqarish operatsiyalari tufayli u ma'lumotlar bazasiga salbiy ta'sir qiladi. Va aksincha - qiymat qanchalik past bo'lsa, OOM-Killer aralashuvi ehtimoli shunchalik yuqori bo'ladi, lekin ma'lumotlar bazasining ishlashi ham yuqori. Standart qiymat 60 dir, lekin agar butun ma'lumotlar bazasi xotiraga to'g'ri kelsa, qiymatni 1 ga qo'ygan ma'qul.

natijalar

OOM-Killer-dagi "qotil" sizni qo'rqitishiga yo'l qo'ymang. Bunday holda, qotil sizning tizimingizning qutqaruvchisi bo'ladi. U eng yomon jarayonlarni "o'ldiradi" va tizimni qulashdan saqlaydi. PostgreSQL-ni tugatish uchun OOM-Killer-dan foydalanmaslik uchun o'rnating vm.overcommit_memory qiymat 2. Bu OOM-Killer aralashmasligiga kafolat bermaydi, lekin PostgreSQL jarayonini tugatishga majbur qilish ehtimolini kamaytiradi.

Manba: www.habr.com

a Izoh qo'shish