
İçəri girəndə Linux Verilənlər bazası serveri gözlənilmədən bağlanır və səbəb müəyyən edilməlidir. Bunun bir neçə səbəbi ola bilər. Məsələ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
Nə vaxt sən server və ya proses yaddaşdan çıxır, Linux Yaddaşsızlıq Qatili iki həll yolu təklif edir: bütün sistemi sıradan çıxarmaq və ya yaddaşı yeyən prosesi (tətbiqi) dayandırmaq. Əlbəttə ki, prosesi dayandırıb ƏS-i sıradan çıxarmaqdan xilas etmək daha yaxşıdır. Bir sözlə, Yaddaşsızlıq Qatili, nüvəni sıradan çıxarmaqdan xilas etmək üçün tətbiqi dayandıran bir prosesdir. ƏS-i işlək vəziyyətdə saxlamaq üçün tətbiqi qurban verir. Əvvəlcə OOM-un necə işlədiyini və onu necə idarə edəcəyini müzakirə edək, sonra isə OOM Qatili hansı tətbiqlərin sıradan çıxarılacağına necə qərar verdiyinə baxaq.
Əsas vəzifələrdən biri Linux — Proseslər tələb etdikdə onlara yaddaş ayırın. Adətən, bir proses və ya tətbiq ƏS-dən yaddaş tələb edir, lakin onu tam istifadə etmir. Əgər ƏS yaddaşı tələb edən, lakin istifadə etməyi planlaşdırmayan hər kəsə ayırırsa, sistem tez bir zamanda yaddaşı tükənəcək və sistem sıradan çıxacaq. Bunun qarşısını almaq üçün ƏS bir proses üçün yaddaş saxlayır, lakin əslində onu ayırmır. Yaddaş yalnız bir proses həqiqətən istifadə etmək niyyətində olduqda ayrılır. Bəzən ƏS-də boş yaddaş olmur, lakin o, bir prosesə yaddaş ayırır və prosesə ehtiyac duyduqda, ƏS bacardığı təqdirdə onu ayırır. Mənfi cəhəti odur ki, bəzən ƏS yaddaşı saxlayır, lakin lazım olduqda boş yaddaş olmur və bu da sistemin sıradan çıxmasına səbəb olur. OOM bu ssenaridə əsas rol oynayır və nüvənin panikaya düşməsinin qarşısını almaq üçün prosesləri dayandırır. PostgreSQL prosesi məcburi şəkildə dayandırıldıqda, jurnalda aşağıdakı 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.
- Nüvə özü üçün minimum yaddaşa ehtiyac duyur.
- Siz çoxlu yaddaş boşaltmalısınız.
- Az yaddaş istifadə edən prosesləri dayandırmağa ehtiyac yoxdur.
- Minimum proseslər tamamlanmalıdır.
- İ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
2OOM-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_adjDəyər təyin etmək üçün oom_score_adj, xidmət blokunda OOMScoreAdjust təyin edin:
[Service]
OOMScoreAdjust=-1000Və ya istifadə edin oomprotect komandada rcctl.
rcctl set <i>servicename</i> oomprotect -1000Prosesi 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 OOM-Killer-i aktivləşdirə və ya deaktiv edə bilərsiniz (sonuncu tövsiyə olunmasa da). Onu aktivləşdirmək və ya deaktiv etmə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 = 1OOM-Killer-i söndürmək üçün eyni əmrdə 0 dəyərini göstərin:
sudo -s sysctl -w vm.oom-kill = 0Bu ə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.confAktivləş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
0Dəyəri 0-a təyin etsəniz, yaddaş bitdikdə nüvə panikası olmayacaq.
$ echo 0 > /proc/sys/vm/panic_on_oomDəyəri 1-ə təyin etsəniz, yaddaş bitdikdə kernel panikası yaranacaq.
echo 1 > /proc/sys/vm/panic_on_oomArtıq qeyd etdiyimiz kimi, OOM-Killer-i yandırıb-söndürmək olar. Linux proseslər üçün mövcud olduğundan daha çox yaddaş ayıra bilər, lakin əslində onu ayıra bilməz və bu davranış nüvə parametri tərəfindən idarə olunur LinuxDəyişən bunun üçün məsuliyyət daşıyır. vm.overcommit_memory.
Bunun üçün aşağıdakı dəyərləri təyin edə bilərsiniz:
0: Çox yaddaş ayırıb-ayrılmamasına nüvənin özü qərar verir. Bu, əksər versiyalarda standart dəyərdir. Linux.
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
