Ho theha Out-Of-Memory Killer ho Linux bakeng sa PostgreSQL

Ho theha Out-Of-Memory Killer ho Linux bakeng sa PostgreSQL

Ha seva sa database se tlohela ho sa lebelloa ho Linux, o hloka ho fumana lebaka. Ho ka ba le mabaka a 'maloa. Ka mohlala, SIGSEGV - ho hloleha ka lebaka la bothata ho seva se ka morao. Empa sena ke seoelo. Hangata, o felloa ke sebaka sa disk kapa memori. Haeba u felloa ke sebaka sa disk, ho na le tsela e le 'ngoe feela ea ho tsoa - lokolla sebaka ebe u qala database hape.

'Molai ea sa Lebaleheng

Ha seva kapa ts'ebetso e felloa ke mohopolo, Linux e fana ka litharollo tse 2: senya sistimi eohle kapa u felise ts'ebetso (ts'ebetso) e jang mohopolo. Ho molemo, ehlile, ho emisa ts'ebetso le ho boloka OS ho senyeha. Ka bokhuts'oane, Out-Of-Memory Killer ke ts'ebetso e bolaeang ts'ebeliso ea ho boloka kernel ho senyeha. E tela kopo ho boloka OS e sebetsa. Ha re qale ka ho tšohla hore na OOM e sebetsa joang le hore na e ka e laola joang, ebe re bona hore na OOM Killer e etsa qeto ea hore na o tla emisa ts'ebeliso efe.

E 'ngoe ea mesebetsi ea mantlha ea Linux ke ho fana ka memori ho lits'ebetso ha ba e kopa. Ka tloaelo, ts'ebetso kapa kopo e kopa memori ho tsoa ho OS, empa ha e e sebelise ka botlalo. Haeba OS e fana ka memori ho bohle ba e kopang empa a se na merero ea ho e sebelisa, haufinyane memori e tla fela mme sistimi e tla hloleha. Ho qoba sena, OS e boloka mohopolo bakeng sa ts'ebetso, empa ha e hlile ha e fane ka eona. Memori e abeloa feela ha mokhoa o tla e sebelisa. Hoa etsahala hore OS ha e na mohopolo oa mahala, empa e fana ka mohopolo ho ts'ebetso, 'me ha ts'ebetso e e hloka, OS e e abela haeba e khona. Taba e nyahamisang ke hore ka linako tse ling OS e boloka mohopolo, empa ka nako e nepahetseng ha ho na mohopolo oa mahala, mme sistimi e oa senyeha. OOM e bapala karolo ea bohlokoa boemong bona mme e emisa lits'ebetso ho thibela kernel ho tšoha. Ha ts'ebetso ea PostgreSQL e qobelloa ho emisa, molaetsa o hlaha ho log:

Out of Memory: Killed process 12345 (postgres).

Haeba sistimi e le tlase mohopolong mme e ke ke ea lokolloa, ts'ebetso e bitsoa out_of_memory. Mothating ona, o na le ntho e le 'ngoe feela e setseng - ho phethela ts'ebetso e le' ngoe kapa ho feta. Na OOM-killer e lokela ho emisa ts'ebetso hang-hang kapa e ka ema? Ho hlakile hore ha ho bitsoa out_of_memory, ke ka lebaka la ho emela ts'ebetso ea I / O kapa paging ho disk. Ka hona, 'molai oa OOM o tlameha ho qala ho hlahloba' me, a ipapisitse le bona, a etse qeto ea hore ts'ebetso e tlameha ho felisoa. Haeba licheke tsohle tse ka tlase li nepahetse, OOM e tla emisa ts'ebetso.

Khetho ea ts'ebetso

Ha memori e fela, tshebetso e bitswa out_of_memory(). E na le mosebetsi select_bad_process(), e amohelang tlhahlobo ho tsoa mosebetsing badness(). Mokhoa o "mpe ka ho fetisisa" o tla lebisitsoe. Mosebetsi badness() e kgethang mokgoa ho ya ka melao e itseng.

  1. Kernel e hloka mohopolo o fokolang bakeng sa eona.
  2. U hloka ho lokolla mohopolo o mongata.
  3. Ha ho na tlhoko ea ho emisa lits'ebetso tse sebelisang mohopolo o fokolang.
  4. Ts'ebetso e fokolang e tlameha ho phethoa.
  5. Li-algorithms tse rarahaneng tse eketsang menyetla ea ho phethoa bakeng sa lits'ebetso tseo mosebelisi ka boeena a batlang ho li phetha.

Ha o qetile licheke tsena kaofela, OOM e hlahloba lintlha (oom_score). OOM e fana oom_score ts'ebetso e 'ngoe le e' ngoe, ebe e atisa boleng bona ka bongata ba mohopolo. Mekhoa e nang le litekanyetso tse kholoanyane e na le monyetla oa ho oela ho OOM Killer. Mekhoa e amanang le mosebelisi ea metso e na le lintlha tse tlase 'me ha ho bonolo hore e qobelloe ho emisa.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

The Postgres process ID ke 3813, kahoo ka khetla e 'ngoe hoa khoneha ho fumana lintlha ka ho sebelisa parameter ena ea kernel. oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Haeba u sa batle hore OOM-Killer e bolaee ts'ebetso ho hang, ho na le khetho e 'ngoe ea kernel: oom_score_adj. Kenya boleng bo boholo bo fosahetseng ho fokotsa menyetla ea ho phethela ts'ebetso eo u e nkang e le ea bohlokoa.

sudo echo -100 > /proc/3813/oom_score_adj

Ho beha boleng oom_score_adj, seta OOMScoreAdjust sebakeng sa tšebeletso:

[Service]
OOMScoreAdjust=-1000

Kapa sebelisa oomprotect sehlopheng rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Qobella pheliso ea ts'ebetso

Ha ts'ebetso e le 'ngoe kapa tse ngata li se li khethiloe, OOM-Killer e letsetsa ts'ebetso oom_kill_task(). Ts'ebetso ena e romella lets'oao la ho emisa ts'ebetsong. Boemong ba khaello ea mohopolo oom_kill() E letsetsa tšebetso ena ho romella lets'oao la SIGKILL ts'ebetsong. Molaetsa o ngolloa ho kernel log.

Out of Memory: Killed process [pid] [name].

Mokhoa oa ho laola OOM-Killer

Ho Linux, o ka nolofalletsa kapa oa tima OOM-Killer (le hoja ea morao-rao e sa khothaletsoe). Ho nolofalletsa kapa ho tima, sebelisa parameter vm.oom-kill. Ho nolofalletsa OOM-Killer ka nako ea ho sebetsa, tsamaisa taelo sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Ho tima OOM-Killer, bolela boleng ba 0 ka taelo e tšoanang:

sudo -s sysctl -w vm.oom-kill = 0

Sephetho sa taelo ena se ke ke sa bolokeha ka ho sa feleng, empa feela ho fihlela ho qala bocha. Haeba o hloka ho phehella ho eketsehileng, eketsa mola ona faeleng /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Tsela e 'ngoe ea ho nolofalletsa le ho thibela ke ho ngola phetoho panic_on_oom. Boleng bo ka hlahlojoa kamehla /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Haeba u beha boleng ho 0, joale ha memori e fela, ho ke ke ha e-ba le tšabo ea kernel.

$ echo 0 > /proc/sys/vm/panic_on_oom

Haeba u beha boleng ho 1, joale ha memori e fela, ho tla ba le tšabo ea kernel.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer e ke ke ea buloa le ho tima feela. Re se re boletse hore Linux e ka boloka mohopolo o mongata bakeng sa lits'ebetso ho feta o fumanehang ntle le ho o abela, mme boits'oaro bona bo laoloa ke parameter ea Linux kernel. Phetoho e ikarabella bakeng sa sena vm.overcommit_memory.

O ka hlalosa litekanyetso tse latelang bakeng sa eona:

0: Kernel ka boeona e etsa qeto ea ho boloka mohopolo o mongata haholo. Sena ke sa kamehla liphetolelong tse ngata tsa Linux.
1: Kernel e tla lula e boloka mohopolo o eketsehileng. Sena se kotsi, hobane mohopolo o ka 'na oa fela, hobane, mohlomong, ka letsatsi le leng mekhoa e tla e hloka.
2: kernel e ke ke ea boloka mohopolo o fetang o boletsoeng paramenteng overcommit_ratio.

Ka paramethara ena, o totobatsa peresente ea memori e lumelletsoeng ho bolokoa ho feta tekano. Haeba ho se na sebaka sa eona, ha ho memori e fanoeng, 'me peheletso e tla haneloa. Ena ke khetho e sireletsehileng ka ho fetisisa e khothalletsoang PostgreSQL. OOM-Killer e angoa ke ntho e 'ngoe - bokhoni ba ho swapping, bo laoloang ke ho fetoha cat /proc/sys/vm/swappiness. Litekanyetso tsena li bolella kernel mokhoa oa ho sebetsana le paging. Ha boleng bo phahame, ha ho na monyetla oa hore OOM e felise ts'ebetso, empa ka lebaka la ts'ebetso ea I / O e na le phello e mpe ho database. Mme ka tsela e fapaneng - ha boleng bo tlase bo le tlase, menyetla ea ho kenella ha OOM-Killer e phahame, empa ts'ebetso ea database le eona e phahame. Boleng ba kamehla ke 60, empa haeba database eohle e lumellana le mohopolo, ho molemo ho beha boleng ho 1.

Liphello

Se ke oa lumella "'molai" ea ho OOM-Killer ho u tšosa. Tabeng ena, 'molai e tla ba mopholosi oa tsamaiso ea hau. E "bolaea" lits'ebetso tse mpe ka ho fetesisa mme e boloka sistimi hore e se ke ea senyeha. Ho qoba ho sebelisa OOM-Killer ho emisa PostgreSQL, beha ho vm.overcommit_memory boleng 2. Sena ha se tiise hore OOM-Killer e ke ke ea tlameha ho kenella, empa e tla fokotsa monyetla oa ho qobella mokhoa oa PostgreSQL hore o khaotse.

Source: www.habr.com

Eketsa ka tlhaloso