PostgreSQL üçün Linux-da Yaddaş Kənar Killer konfiqurasiyası

PostgreSQL üçün Linux-da Yaddaş Kənar Killer konfiqurasiyası

Linux-da verilənlər bazası serveri gözlənilmədən çıxdıqda, bunun səbəbini tapmaq lazımdır. Bunun bir neçə səbəbi ola bilər. Misal üçün, SIGSEGV — backend serverindəki səhv səbəbindən uğursuzluq. Ancaq bu nadirdir. Çox vaxt sadəcə disk sahəsi və ya yaddaşınız tükənir. Disk yeriniz tükənirsə, yalnız bir çıxış yolu var - yer boşaltın və verilənlər bazasını yenidən başladın.

Yaddaşdan Killer

Server və ya proses yaddaşı tükəndikdə, Linux 2 həll yolu təklif edir: bütün sistemi çökdürün və ya yaddaşı yeyən prosesi (tətbiqi) dayandırın. Əlbəttə ki, prosesi dayandırmaq və OS-ni qəzadan xilas etmək daha yaxşıdır. Qısaca desək, Out-Of-Memory Killer nüvəni qəzadan xilas etmək üçün proqramı öldürən bir prosesdir. ƏS-nin işləməsini təmin etmək üçün tətbiqi qurban verir. Gəlin əvvəlcə OOM-un necə işlədiyini və ona necə nəzarət edəcəyimizi müzakirə edək, sonra OOM Killer-in hansı tətbiqi dayandıracağına necə qərar verdiyinə baxaq.

Linux-un əsas vəzifələrindən biri yaddaşı proseslər tələb etdikdə onlara ayırmaqdır. Tipik olaraq, proses və ya proqram ƏS-dən yaddaş tələb edir, lakin ondan tam istifadə etmir. Əgər ƏS onu istəyən, lakin ondan istifadə etmək niyyətində olmayan hər kəsə yaddaş verirsə, çox keçmədən yaddaş tükənəcək və sistem sıradan çıxacaq. Bunun qarşısını almaq üçün OS proses üçün yaddaş saxlayır, lakin əslində onu buraxmır. Yaddaş yalnız proses onu həqiqətən istifadə edəcək zaman ayrılır. Belə olur ki, ƏS-nin boş yaddaşı yoxdur, lakin o, yaddaşı prosesə təyin edir və proses ona ehtiyac duyduqda ƏS imkan daxilində onu ayırır. İşin mənfi tərəfi odur ki, bəzən ƏS yaddaş saxlayır, lakin lazımi anda boş yaddaş olmur və sistem çökür. OOM bu ssenaridə mühüm rol oynayır və nüvənin panikaya düşməsinin qarşısını almaq üçün prosesləri dayandırır. PostgreSQL prosesini dayandırmaq məcburiyyətində qaldıqda, jurnalda bir mesaj görünür:

Out of Memory: Killed process 12345 (postgres).

Sistemdə yaddaş azdırsa və onu boşaltmaq mümkün deyilsə, funksiya çağırılır out_of_memory. Bu mərhələdə onun yalnız bir işi qalır - bir və ya bir neçə prosesi tamamlayın. OOM-killer prosesi dərhal dayandırmalıdır, yoxsa gözləyə bilərmi? Aydındır ki, out_of_memory çağırıldıqda, bu, giriş/çıxış əməliyyatını gözləmək və ya diskə peyjinqlə bağlıdır. Buna görə də, OOM qatili əvvəlcə yoxlamalar aparmalı və onlara əsaslanaraq prosesin dayandırılmasına qərar verməlidir. Aşağıdakı bütün yoxlamalar müsbət olarsa, OOM prosesi dayandıracaq.

Proses seçimi

Yaddaş bitdikdə funksiya çağırılır out_of_memory(). Onun funksiyası var select_bad_process(), funksiyadan qiymətləndirmə alan badness(). “Ən pis” proses hədəfə alınacaq. Funksiya badness() müəyyən qaydalara əsasən prosesi seçir.

  1. Nüvə özü üçün minimum yaddaşa ehtiyac duyur.
  2. Siz çoxlu yaddaş boşaltmalısınız.
  3. Az yaddaş istifadə edən prosesləri dayandırmağa ehtiyac yoxdur.
  4. Minimum proseslər tamamlanmalıdır.
  5. İstifadəçinin özünün tamamlamaq istədiyi proseslərin tamamlanma şansını artıran mürəkkəb alqoritmlər.

Bütün bu yoxlamaları tamamladıqdan sonra OOM balı yoxlayır (oom_score). OOM təyin edir oom_score hər bir proses və sonra bu dəyəri yaddaşın miqdarına vurur. Daha böyük dəyərlərə malik proseslərin OOM Killer-in qurbanı olma ehtimalı daha yüksəkdir. Kök istifadəçi ilə əlaqəli proseslər daha aşağı hesaba malikdir və onları dayandırmağa məcbur edilmə ehtimalı azdır.

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

Postgres proses identifikatoru 3813-dür, buna görə də başqa bir qabıqda bu kernel parametrindən istifadə edərək xal əldə etmək mümkündür. oom_score:

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

OOM-Killer-in prosesi ümumiyyətlə öldürməsini istəmirsinizsə, başqa bir nüvə seçimi var: oom_score_adj. Dəyər verdiyiniz prosesi tamamlamaq şansını azaltmaq üçün böyük bir mənfi dəyər əlavə edin.

sudo echo -100 > /proc/3813/oom_score_adj

Dəyər təyin etmək üçün oom_score_adj, xidmət blokunda OOMScoreAdjust təyin edin:

[Service]
OOMScoreAdjust=-1000

Və ya istifadə edin oomprotect komandada rcctl.

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

Prosesi zorla dayandırmaq

Bir və ya bir neçə proses artıq seçildikdə, OOM-Killer funksiyanı çağırır oom_kill_task(). Bu funksiya prosesə xitam siqnalı göndərir. Yaddaş çatışmazlığı halında oom_kill() Prosesə SIGKILL siqnalı göndərmək üçün bu funksiyanı çağırır. Kernel jurnalına mesaj yazılır.

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

OOM-Killer-ə necə nəzarət etmək olar

Linux-da siz OOM-Killer-i aktivləşdirə və ya söndürə bilərsiniz (baxmayaraq ki, sonuncu tövsiyə edilmir). Aktivləşdirmək və ya söndürmək üçün parametrdən istifadə edin vm.oom-kill. OOM-Killer-i iş vaxtında aktivləşdirmək üçün əmri işə salın sysctl.

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

OOM-Killer-i söndürmək üçün eyni əmrdə 0 dəyərini göstərin:

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

Bu əmrin nəticəsi əbədi olaraq saxlanmayacaq, ancaq ilk yenidən işə salınana qədər. Əgər daha çox əzmkarlığa ehtiyacınız varsa, bu sətri fayla əlavə edin /etc/sysctl.conf:

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

Aktivləşdirmənin və söndürməyin başqa bir yolu dəyişən yazmaqdır panic_on_oom. Dəyəri həmişə yoxlanıla bilər /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Dəyəri 0-a təyin etsəniz, yaddaş bitdikdə nüvə panikası olmayacaq.

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

Dəyəri 1-ə təyin etsəniz, yaddaş bitdikdə kernel panikası yaranacaq.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer yalnız yandırıla və söndürülə bilməz. Biz artıq demişdik ki, Linux proseslər üçün faktiki olaraq onu ayırmadan mövcud olandan daha çox yaddaş saxlaya bilər və bu davranış Linux nüvəsi parametri ilə idarə olunur. Dəyişən buna görə məsuliyyət daşıyır vm.overcommit_memory.

Bunun üçün aşağıdakı dəyərləri təyin edə bilərsiniz:

0: Yaddaşın həddən artıq saxlanıb saxlanmayacağına nüvə özü qərar verir. Bu, Linux-un əksər versiyalarında standartdır.
1: Kernel həmişə əlavə yaddaş saxlayacaqdır. Bu risklidir, çünki yaddaş tükənə bilər, çünki çox güman ki, bir gün proseslər bunu tələb edəcək.
2: kernel parametrdə göstəriləndən çox yaddaş saxlamayacaq overcommit_ratio.

Bu parametrlə siz həddən artıq ehtiyata icazə verilən yaddaş faizini təyin edirsiniz. Əgər onun üçün yer yoxdursa, yaddaş ayrılmır və rezervasiya rədd edilir. Bu PostgreSQL üçün tövsiyə olunan ən təhlükəsiz seçimdir. OOM-Killer başqa bir elementdən təsirlənir - dəyişən tərəfindən idarə olunan dəyişdirmə qabiliyyəti cat /proc/sys/vm/swappiness. Bu dəyərlər kernelə peyjinqlə necə davranacağını bildirir. Dəyər nə qədər yüksək olarsa, OOM-un prosesi dayandırma ehtimalı bir o qədər azdır, lakin I/O əməliyyatlarına görə o, verilənlər bazasına mənfi təsir göstərir. Və əksinə - dəyər nə qədər aşağı olarsa, OOM-Killer müdaxiləsi ehtimalı bir o qədər yüksəkdir, lakin verilənlər bazası performansı da yüksəkdir. Varsayılan dəyər 60-dır, lakin bütün verilənlər bazası yaddaşa uyğundursa, dəyəri 1-ə təyin etmək daha yaxşıdır.

Nəticələri

OOM-Killer-dəki "qatil"in sizi qorxutmasına imkan verməyin. Bu vəziyyətdə qatil sisteminizin xilaskarı olacaq. O, ən pis prosesləri “öldürür” və sistemi qəzadan xilas edir. PostgreSQL-i dayandırmaq üçün OOM-Killer-dən istifadə etməmək üçün seçin vm.overcommit_memory dəyər 2. Bu, OOM-Killer-in müdaxilə etməyəcəyinə zəmanət vermir, lakin PostgreSQL prosesini dayandırmağa məcbur etmək ehtimalını azaldacaq.

Mənbə: www.habr.com

Добавить комментарий