
I te wa i roto Linux Ka mutu ohorere te tūmau pātengi raraunga, ā, me whakatau te take. Tērā pea he maha ngā take. Hei tauira, SIGSEGV — i rahua na te hapa i roto i te tūmau o muri. Engari he onge tenei. I te nuinga o nga wa, ka pau noa te mokowā kōpae, te pūmahara rānei. Ki te pau te mokowā kōpae, kotahi noa te huarahi ki waho - whakawāteahia te mokowā ka tīmata anō i te pātengi raraunga.
Kaipatu Pumahara-waho
Ina koe tūmau ka pau rānei te mahara o te tukanga, Linux E rua ngā otinga a te Out-Of-Memory Killer: te tukinga i te pūnaha katoa, te whakamutu rānei i te tukanga (taupānga) e kai ana i te mahara. He pai ake, ko te tikanga, te whakamutu i te tukanga me te tiaki i te OS mai i te tukinga. I roto i te poto, ko te Out-Of-Memory Killer he tukanga e whakamutu ana i tētahi tono hei tiaki i te kernel mai i te tukinga. Ka patua te tono kia mau tonu te OS. Me matapaki tuatahi tātou me pēhea te mahi a te OOM me pēhea te whakahaere, kātahi ka titiro ki te whakatau a te OOM Killer ko ēhea tono hei whakamutu.
Ko tētahi o ngā mahi matua Linux — Tohaina te mahara ki ngā tukanga ina tonoa. Ko te tikanga, ka tono mahara te tukanga, te tono rānei mai i te pūnaha whakahaere engari kāore e whakamahia katoatia. Mena ka tohaina e te pūnaha whakahaere te mahara ki te hunga katoa e tono ana engari kāore e whakaaro ki te whakamahi, ka tere te pau o te mahara o te pūnaha, ā, ka hinga te pūnaha. Hei ārai i tēnei, ka rāhuitia e te pūnaha whakahaere te mahara mō tētahi tukanga engari kāore e tohaina. Ka tohaina te mahara ina hiahia noa te tukanga ki te whakamahi. I ētahi wā kāore he mahara wātea o te pūnaha whakahaere, engari ka tohaina e ia te mahara ki tētahi tukanga, ā, ina hiahiatia e te tukanga, ka tohaina e te pūnaha whakahaere mēnā ka taea. Ko te ngoikoretanga ko ētahi wā ka rāhuitia e te pūnaha whakahaere te mahara, engari ina hiahiatia, kāore he mahara wātea, ka puta he hinganga o te pūnaha. He mahi nui tā te OOM i tēnei horopaki, ka whakamutua ngā tukanga hei ārai i te mataku o te kernel. Ina whakamutua te tukanga PostgreSQL, ka puta te karere e whai ake nei i roto i te rangitaki:
Out of Memory: Killed process 12345 (postgres).Mena he iti te mahara o te punaha me te kore e taea te wewete, ka kiia te mahi out_of_memory. I tenei wa, kotahi noa te mea e toe ana ki a ia - kia oti tetahi, neke atu ranei nga tukanga. Me whakamutua e te Kaipatu-OOM te mahi tonu ka tatari ranei? Ko te tikanga, ka karangahia te out_of_memory, me tatari mo tetahi mahi I/O, wharangi wharangi ranei ki te kōpae. No reira, me mahi te kaipatu OOM i nga arowhai tuatahi, a, i runga i a raatau, whakatau me whakamutu te mahi. Mena he pai nga arowhai i raro nei, ka whakamutua e OOM te mahi.
Tukatuka whiriwhiri
Ka pau te mahara, ka karangahia te mahi out_of_memory(). He mahi select_bad_process(), ka whiwhi i te arotakenga mai i te mahi badness(). Ko te tukanga "kino" ka arohia. Mahi badness() ka whiriwhiri i tetahi tukanga i runga i etahi ture.
- Me iti te mahara o te kernel mo ia ake.
- Me whakawātea koe i te maha o te mahara.
- Kaore he take ki te whakamutu i nga tukanga e whakamahi iti ana te mahara.
- Me whakaoti nga tukanga iti rawa.
- Ko nga algorithms matatini e whakanui ana i te tupono ki te whakaoti mo aua tukanga e hiahia ana te kaiwhakamahi ki te whakaoti.
Ka oti enei arowhai katoa, ka tirohia e OOM te kaute (oom_score). Ka tohatohahia e OOM oom_score ia tukanga, ka whakareatia tenei uara ki te nui o te mahara. Ko nga tukanga me nga uara nui ka kaha ki te hinga ki te OOM Killer. Ko nga tukanga e pa ana ki te kaiwhakamahi pakiaka he iti ake te kaute, ka iti ake te kaha ki te whakamutu.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Ko te ID tukanga Postgres he 3813, no reira i tetahi atu anga ka taea te tiki i te kaute ma te whakamahi i tenei tawhā kernel oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Mena kaore koe e hiahia ki te OOM-Killer ki te patu i te tukanga, tera ano tetahi atu whiringa kernel: oom_score_adj. Taapirihia he uara kino nui hei whakaiti i te tupono ki te whakaoti i tetahi tukanga e wariuhia ana e koe.
sudo echo -100 > /proc/3813/oom_score_adjHei whakarite uara oom_score_adj, tautuhia te OOMScoreAdjust ki te paraka ratonga:
[Service]
OOMScoreAdjust=-1000Whakamahi ranei oomprotect i roto i te kapa rcctl.
rcctl set <i>servicename</i> oomprotect -1000Whakamutua he tukanga
Ina kua kowhiria tetahi, neke atu ranei nga tukanga, ka karangahia e OOM-Killer te mahi oom_kill_task(). Ka tukuna e tenei mahi he tohu whakamutu ki te tukanga. Mena he ngoikore te mahara oom_kill() Karangatia tenei mahi ki te tuku tohu SIGKILL ki te mahi. Ka tuhia he karere ki te rangitaki kernel.
Out of Memory: Killed process [pid] [name].Me pehea te whakahaere i te OOM-Killer
В Linux Ka taea e koe te whakahohe, te whakakore rānei i te OOM-Killer (ahakoa kāore i te tūtohutia te mea whakamutunga). Hei whakahohe, hei whakakore rānei, whakamahia te tawhā vm.oom-kill. Kia taea ai te OOM-Killer i te wa whakahaere, whakahaeretia te whakahau sysctl.
sudo -s sysctl -w vm.oom-kill = 1Hei whakakore i te OOM-Killer, tohua te uara 0 i roto i te whakahau ano:
sudo -s sysctl -w vm.oom-kill = 0Ko te hua o tenei whakahau e kore e ora ake ake, engari tae noa ki te whakaaraara tuatahi. Mena ka hiahia koe kia kaha ake, taapirihia tenei raina ki te konae /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confKo tetahi atu huarahi ki te whakahohe me te mono ko te tuhi i tetahi taurangi panic_on_oom. Ka taea te taki i nga wa katoa te uara /proc.
$ cat /proc/sys/vm/panic_on_oom
0Mena ka whakatauhia e koe te uara ki te 0, ka pau te mahara, karekau he pawera o te kernel.
$ echo 0 > /proc/sys/vm/panic_on_oomMena ka whakatauhia e koe te uara ki te 1, ka mutu te mahara, ka puta he riipene kernel.
echo 1 > /proc/sys/vm/panic_on_oomKa taea te whakakā me te whakaweto i te OOM-Killer, e ai ki tā mātou i kōrero ake nei. Linux tērā pea ka nui ake te mahara e rahuitia ana mō ngā tukanga i te mea e wātea ana, engari kāore e tino tohaina, ā, ko tēnei whanonga e whakahaerehia ana e te tawhā kernel LinuxKo te taurangi te kawenga mō tēnei. vm.overcommit_memory.
Ka taea e koe te tautuhi i nga uara e whai ake nei mo taua mea:
0: Ko te kernel tonu te whakatau mēnā ka nui rawa te mahara e rahuitia ana. Koinei te uara taunoa i roto i te nuinga o ngā putanga. Linux.
1: Ka rahuitia e te kernel te mahara taapiri i nga wa katoa. He mea whakararu tenei, na te mea ka pau te mahara, na te mea, tera pea, i tetahi ra ka hiahiatia e nga tukanga.
2: e kore e rahuitia e te kernel te mahara nui atu i te mea kua tohua ki te tawhā overcommit_ratio.
Ma tenei tawhā, ka tohua e koe te ōrau o te pūmahara e whakaaetia ana kia nui rawa te rahui. Mena kaore he waahi mo taua mea, kaore he maharatanga ka tohatohahia, ka whakakorehia te rahui. Koinei te waahanga haumaru e taunaki ana mo PostgreSQL. Ko te OOM-Killer ka pangia e tetahi atu huānga - te kaha whakawhiti, e whakahaeretia ana e te taurangi cat /proc/sys/vm/swappiness. Ko enei uara e whakaatu ana ki te kernel me pehea te hapai i te wharangi. Ko te teitei ake o te uara, ka iti ake pea ka whakamutua e te OOM te mahi, engari na nga mahi I/O ka pa he kino ki runga i te putunga korero. He rereke - ko te iti ake o te uara, ka nui ake te tupono o te wawaotanga OOM-Killer, engari he nui ake te mahinga o te papaunga raraunga. Ko te uara taunoa ko te 60, engari mena ka uru te katoa o te paataka raraunga ki te mahara, he pai ake te whakarite i te uara ki te 1.
Ngā putanga
Kaua e tukua te "kaipatu" i OOM-Killer kia mataku koe. I tenei keehi, ko te kaipatu hei kaiwhakaora mo to punaha. Ka "whakamate" i nga tukanga kino rawa atu, ka whakaora i te punaha mai i te pakaru. Hei karo i te whakamahi OOM-Killer ki te whakamutu i te PostgreSQL, tautuhia ki vm.overcommit_memory uara 2. Kaore tenei e kii ka kore a OOM-Killer e wawao, engari ka whakaitihia te tupono o te akiaki i te tukanga PostgreSQL kia mutu.
Source: will.com
