
Lè nan Linux Sèvè baz done a fini sanzatann, epi nou bezwen detèmine kòz la. Ka gen plizyè rezon. Pa egzanp, SIGSEGV â echèk akòz yon ensèk nan sèvè backend la. Men, sa a se ra. Pi souvan, ou tou senpleman kouri soti nan espas disk oswa memwa. Si ou fini nan espas ki gen kapasite, gen yon sèl fason pou sòti - libere espas epi rekòmanse baz done a.
Asasen ki pa memwa
Lè ou sèvè oubyen pwosesis la pa gen ase memwa, Linux Asasen Memwa ki Pa Gen Anpil la ofri de solisyon: fè tout sistèm nan plante oubyen fini pwosesis la (aplikasyon an) k ap konsome memwa a. Li pi bon, nan kou, pou fini pwosesis la epi sove sistèm operasyon an pou l pa plante. An brèf, Asasen Memwa ki Pa Gen Anpil la se yon pwosesis ki fini yon aplikasyon pou sove nwayo a pou l pa plante. Li sakrifye aplikasyon an pou sistèm operasyon an kontinye fonksyone. Ann premye diskite kijan OOM fonksyone ak kijan pou kontwole li, epi answit gade kijan Asasen OOM nan deside ki aplikasyon pou fini.
Youn nan travay prensipal yo Linux â Alokasyon memwa bay pwosesis yo lè yo mande li. Tipikman, yon pwosesis oswa yon aplikasyon mande memwa nan men sistèm operasyon an men li pa itilize li nèt. Si sistèm operasyon an alokasyon memwa bay tout moun ki mande li men li pa gen plan pou itilize li, sistèm nan ap byen vit fini memwa, epi sistèm nan ap kraze. Pou anpeche sa, sistèm operasyon an rezève memwa pou yon pwosesis men li pa aktyèlman alokasyon li. Yo alokasyon memwa sèlman lè yon pwosesis gen entansyon itilize li. Pafwa sistèm operasyon an pa gen memwa lib, men li alokasyon memwa bay yon pwosesis, epi lè pwosesis la bezwen li, sistèm operasyon an alokasyon li si li kapab. Dezavantaj la se ke pafwa sistèm operasyon an rezève memwa, men lè sa nesesè, pa gen memwa lib, sa ki lakòz yon aksidan sistèm. OOM jwe yon wòl kle nan senaryo sa a, li fini pwosesis yo pou anpeche nwayo a panike. Lè yo fòse pwosesis PostgreSQL la fini, mesaj sa a parèt nan jounal la:
Out of Memory: Killed process 12345 (postgres).Si sistèm nan pa gen anpil memwa epi li pa ka libere, yo rele fonksyon an out_of_memory. Nan etap sa a, li gen yon sèl bagay ki rete pou fè - ranpli youn oswa plizyè pwosesis. Ăske OOM-Killer ta dwe sispann pwosesis la imedyatman oswa li ka tann? Li evidan, lè yo rele out_of_memory, li se akòz ap tann pou yon operasyon I/O oswa paging sou disk. Se poutèt sa, asasen an OOM dwe premye fè chèk epi, ki baze sou yo, deside ke pwosesis la bezwen yo dwe sispann. Si tout chèk ki anba yo pozitif, OOM ap mete fen nan pwosesis la.
Seleksyon pwosesis
Lè memwa fini, yo rele fonksyon an out_of_memory(). Li gen yon fonksyon select_bad_process(), ki resevwa yon evalyasyon nan fonksyon an badness(). Pwosesis "pi move" la pral vize. Fonksyon badness() chwazi yon pwosesis selon sèten règ.
- Kernel la bezwen kèk memwa minimòm pou tèt li.
- Ou bezwen libere anpil memwa.
- Pa gen okenn nesesite pou mete fen nan pwosesis ki ap itilize ti memwa.
- Pwosesis minimòm yo dwe ranpli.
- Algoritm konplèks ki ogmante chans pou yo fini pou pwosesis sa yo ke itilizatè a li menm vle konplete.
Lè w fin ranpli tout chèk sa yo, OOM egzamine nòt la (oom_score). OOM plase oom_score chak pwosesis, ak Lè sa a, miltipliye valè sa a pa kantite lajan an nan memwa. Pwosesis ki gen pi gwo valè yo gen plis chans tonbe viktim nan OOM Killer la. Pwosesis ki asosye ak itilizatè rasin lan gen yon nòt ki pi ba epi yo gen mwens chans pou yo fòse yo sispann.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)ID pwosesis Postgres la se 3813, kidonk nan yon lòt koki li posib pou jwenn nòt la lè l sèvi avèk paramèt nwayo sa a. oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Si ou pa vle OOM-Killer touye pwosesis la ditou, gen yon lòt opsyon nwayo: oom_score_adj. Ajoute yon gwo valè negatif pou redwi chans pou konplete yon pwosè ou valeur.
sudo echo -100 > /proc/3813/oom_score_adjPou mete yon valè oom_score_adj, mete OOMScoreAdjust nan blòk sèvis la:
[Service]
OOMScoreAdjust=-1000Oswa itilize oomprotect nan yon ekip rcctl.
rcctl set <i>servicename</i> oomprotect -1000Fòs revokasyon yon pwosesis
Lè youn oswa plizyè pwosesis yo deja chwazi, OOM-Killer rele fonksyon an oom_kill_task(). Fonksyon sa a voye yon siyal revokasyon nan pwosesis la. Nan ka mank memwa oom_kill() Rele fonksyon sa a pou voye yon siyal SIGKILL nan pwosesis la. Yo ekri yon mesaj nan jounal nwayo a.
Out of Memory: Killed process [pid] [name].Ki jan yo kontwole OOM-Killer
РLinux Ou ka aktive oswa dezaktive OOM-Killer (byenke dènye opsyon an pa rekòmande). Pou aktive oswa dezaktive li, sèvi ak paramèt la vm.oom-kill. Pou pèmèt OOM-Killer nan ègzekutabl, kouri lòd la sysctl.
sudo -s sysctl -w vm.oom-kill = 1Pou enfim OOM-Killer, presize valè 0 nan menm lòd la:
sudo -s sysctl -w vm.oom-kill = 0Rezilta kòmandman sa a pa pral sove pou tout tan, men sèlman jiskaske premye rdemare a. Si ou bezwen plis pèsistans, ajoute liy sa a nan dosye a /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confYon lòt fason pou pèmèt ak enfim se ekri yon varyab panic_on_oom. Valè a ka toujou tcheke nan /proc.
$ cat /proc/sys/vm/panic_on_oom
0Si ou mete valè a 0, Lè sa a, lè memwa fini, pa pral gen panik nwayo.
$ echo 0 > /proc/sys/vm/panic_on_oomSi ou mete valè a 1, Lè sa a, lè memwa a fini, yon panik nwayo pral rive.
echo 1 > /proc/sys/vm/panic_on_oomOu ka aktive epi dezaktive OOM-Killer la, jan nou te deja mansyone a. Linux ka rezève plis memwa pou pwosesis pase sa ki disponib, men li pa ka aktyèlman asiyen li, epi konpòtman sa a kontwole pa yon paramèt nwayo. LinuxVaryab la responsab pou sa. vm.overcommit_memory.
Ou ka presize valè sa yo pou li:
0: Se nwayo a li menm ki deside si li dwe rezève twòp memwa. Sa a se valè pa defo a nan pifò vèsyon yo. Linux.
1: Kernel la ap toujou rezève memwa siplemantè. Sa a se riske, paske memwa a ka fini, paske, gen plis chans, yon jou pwosesis yo pral mande pou li.
2: nwayo a pa pral rezève plis memwa pase sa ki espesifye nan paramèt la overcommit_ratio.
Avèk paramèt sa a, ou presize pousantaj memwa ki gen dwa rezève twòp. Si pa gen plas pou li, pa gen okenn memwa atribye ba, epi rezèvasyon an pral refize. Sa a se opsyon ki pi an sekirite rekòmande pou PostgreSQL. OOM-Killer afekte pa yon lòt eleman - kapasite nan echanj, ki se kontwole pa varyab la cat /proc/sys/vm/swappiness. Valè sa yo di nwayo a ki jan yo okipe paging. Plis valè a pi wo, se mwens chans pou OOM pral mete fen nan pwosesis la, men akòz operasyon I/O li gen yon enpak negatif sou baz done a. Ak vis vèrsa - pi ba valè a, pi gwo chans pou entèvansyon OOM-Killer, men pèfòmans baz done a pi wo tou. Valè default la se 60, men si tout baz done a anfòm nan memwa, li pi bon pou mete valè a 1.
Rezilta
Pa kite "asasen an" nan OOM-Killer fè ou pè. Nan ka sa a, asasen an pral sovè sistèm ou an. Li "touye" pwosesis ki pi mal yo epi sove sistèm lan soti nan ekraze. Pou evite gen pou itilize OOM-Killer pou mete fen nan PostgreSQL, mete sou vm.overcommit_memory valè 2. Sa a pa garanti ke OOM-Killer pa pral oblije entèvni, men li pral diminye chans pou fòse pwosesis PostgreSQL la sispann.
Sous: www.habr.com
