Xotiradan tashqari qotilni sozlash Linux PostgreSQL uchun

Xotiradan tashqari qotilni sozlash Linux PostgreSQL uchun

Qachon kirasiz Linux Ma'lumotlar bazasi serveri kutilmaganda tugaydi va sababini aniqlash kerak. Buning bir nechta sabablari 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

Qachon siz server yoki jarayon xotirada tugaydi, Linux Xotiradan tashqari holatlarni bartaraf etish vositasi ikkita yechimni taklif qiladi: butun tizimni ishdan chiqarish yoki xotirani egallab turgan jarayonni (ilovani) tugatish. Albatta, jarayonni tugatib, operatsion tizimni ishdan chiqishidan saqlab qolish yaxshiroqdir. Xulosa qilib aytganda, Xotiradan tashqari holatlarni bartaraf etish vositasi yadroni ishdan chiqishidan saqlab qolish uchun dasturni tugatadigan jarayondir. Operatsion tizimni ishlashini ta'minlash uchun u dasturni qurbon qiladi. Avval OOM qanday ishlashini va uni qanday boshqarishni muhokama qilaylik, keyin OOM bartaraf etish vositasi qaysi ilovalarni tugatishni qanday hal qilishini ko'rib chiqaylik.

Asosiy vazifalardan biri Linux — Xotirani jarayonlar so'raganda ularga ajrating. Odatda, jarayon yoki dastur OT dan xotira so'raydi, lekin undan to'liq foydalanmaydi. Agar OT xotirani so'ragan, lekin undan foydalanishni rejalashtirmagan har bir kishiga ajratsa, tizim tezda xotira tugaydi va tizim ishdan chiqadi. Buning oldini olish uchun OT jarayon uchun xotirani zaxiralaydi, lekin aslida uni ajratmaydi. Xotira faqat jarayon aslida undan foydalanmoqchi bo'lganida ajratiladi. Ba'zan OTda bo'sh xotira bo'lmaydi, lekin u jarayonga xotira ajratadi va jarayonga kerak bo'lganda, OT imkoni bo'lsa, uni ajratadi. Salbiy tomoni shundaki, ba'zida OT xotirani zaxiralaydi, lekin kerak bo'lganda bo'sh xotira bo'lmaydi, bu esa tizimning ishdan chiqishiga olib keladi. OOM bu stsenariyda asosiy rol o'ynaydi, yadroning vahimaga tushishining oldini olish uchun jarayonlarni tugatadi. PostgreSQL jarayoni majburan tugatilganda, jurnalda quyidagi 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 Siz OOM-Killer-ni yoqishingiz yoki o'chirishingiz mumkin (garchi ikkinchisi tavsiya etilmasa ham). Uni 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

Yuqorida aytib o'tganimizdek, OOM-Killer-ni yoqish va o'chirish mumkin. Linux jarayonlar uchun mavjud bo'lganidan ko'proq xotirani zaxiralashi mumkin, lekin aslida uni ajratmaydi va bu xatti-harakatlar yadro parametri tomonidan boshqariladi LinuxBuning uchun o'zgaruvchi javobgar. vm.overcommit_memory.

Buning uchun quyidagi qiymatlarni belgilashingiz mumkin:

0: Juda ko'p xotirani zaxiralash yoki zaxiralamaslikni yadroning o'zi hal qiladi. Bu ko'pgina versiyalarda standart qiymat. Linux.
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

DDoS himoyasi, VPS VDS serverlari bo'lgan saytlar uchun ishonchli hosting sotib oling 🔥 DDoS himoyasi, VPS VDS serverlari bilan ishonchli veb-sayt xostingini sotib oling | ProHoster