Te whakatu i te Kaipatu Mahara-waho ki Linux mo PostgreSQL

Te whakatu i te Kaipatu Mahara-waho ki Linux mo PostgreSQL

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.

  1. Me iti te mahara o te kernel mo ia ake.
  2. Me whakawātea koe i te maha o te mahara.
  3. Kaore he take ki te whakamutu i nga tukanga e whakamahi iti ana te mahara.
  4. Me whakaoti nga tukanga iti rawa.
  5. 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

Tāpiri i te kōrero