Ka mutu ohorere te tūmau pātengi raraunga i Linux, me rapu koe i te take. He maha pea nga 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
Ka pau te mahara o te tūmau, te tukanga rānei, ka tukuna e Linux nga otinga e 2: ka pakaru te punaha katoa, ka mutu ranei te tukanga (tono) e kai ana i te mahara. He pai ake, ko te tikanga, ki te whakamutu i te tukanga me te whakaora i te OS mai i te pakaru. I roto i nga korero poto, ko te Kaipatu-O-Of-Memory he tukanga e patu ana i tetahi tono hei whakaora i te kakano kei pakaru. Ka patua e ia te tono kia mau tonu te OS. Me korero tuatahi me pehea te mahi a OOM me pehea te whakahaere, katahi ka kite me pehea te whakatau a OOM Killer ko tehea tono ka whakamutua.
Ko tetahi o nga mahi matua o Linux ko te tohatoha mahara ki nga tukanga ina tono ana ratou. Ko te tikanga, ka tono mahara tetahi tukanga, tono ranei mai i te OS, engari kaore e tino whakamahia. Mena ka tukuna e te OS te mahara ki nga tangata katoa e tono ana engari kaore he mahere ki te whakamahi, kare e roa ka pau te mahara ka kore te punaha. Hei karo i tenei, ka tiakina e te OS te mahara mo te tukanga, engari kaore e tukuna. Ka tohatohahia te mahara ina ka whakamahia e tetahi tukanga. Ka puta ko te OS kaore he mahara kore utu, engari ka whakawhiwhia e ia te mahara ki tetahi tukanga, a, ka hiahiatia e te tukanga, ka tohatohahia e te OS mena ka taea. Ko te kino ko etahi wa ka tiakina e te OS te mahara, engari i te wa tika kaore he mahara kore utu, ka pakaru te punaha. He mahi nui a OOM ki tenei ahuatanga ka whakamutua e ia nga tikanga kia kore ai e mataku te kakano. Ina pehia he tukanga PostgreSQL ki te whakamutu, ka puta he karere ki 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
2
Mena 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_adj
Hei whakarite uara oom_score_adj
, tautuhia te OOMScoreAdjust ki te paraka ratonga:
[Service]
OOMScoreAdjust=-1000
Whakamahi ranei oomprotect
i roto i te kapa rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
Whakamutua 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
I runga i te Linux, ka taea e koe te whakakore, te whakakore ranei i te OOM-Killer (ahakoa kaore i te tūtohutia). Hei whakahohe, mono ranei, 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 = 1
Hei whakakore i te OOM-Killer, tohua te uara 0 i roto i te whakahau ano:
sudo -s sysctl -w vm.oom-kill = 0
Ko 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.conf
Ko 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
0
Mena 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_oom
Mena 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_oom
Ko te OOM-Killer e kore e taea anake te whakaka me te whakaweto. Kua kii ano matou ka taea e Linux te rahui i nga maharatanga nui ake mo nga tukanga i te wa e waatea ana me te kore e toha, ka whakahaeretia tenei whanonga e te tawhā kernel Linux. Ko te taurangi te kawenga mo tenei vm.overcommit_memory
.
Ka taea e koe te tautuhi i nga uara e whai ake nei mo taua mea:
0: Ko te kernel ake e whakatau mena ka rahuihia te maha o nga mahara. Koinei te taunoa i runga i te nuinga o nga putanga o 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