Mametraka Killer Out-Of-Memory amin'ny Linux ho an'ny PostgreSQL

Mametraka Killer Out-Of-Memory amin'ny Linux ho an'ny PostgreSQL

Rehefa miala tsy nampoizina amin'ny Linux ny mpizara database iray dia mila mitady ny antony ianao. Mety misy antony maromaro. Ohatra, SIGSEGV - tsy fahombiazana noho ny bibikely ao amin'ny server backend. Tsy fahita firy anefa izany. Matetika, lany fotsiny ny habaka kapila na fahatsiarovana. Raha lany ny habaka kapila dia tsy misy afa-tsy ny lalana hivoahana - manafaka toerana ary avereno indray ny angon-drakitra.

Famonoana tsy misy fitadidiana

Rehefa lany ny fitadidiana ny mpizara na ny dingana iray, dia manolotra vahaolana 2 ny Linux: midona amin'ny rafitra manontolo na manafoana ny dingana (fampiharana) izay mihinana fahatsiarovana. Tsara kokoa, mazava ho azy, ny hampitsahatra ny dingana ary hamonjy ny OS tsy hianjera. Raha fintinina, ny Out-Of-Memory Killer dia dingana iray mamono fampiharana iray hamonjena ny kernel tsy hidona. Izy io dia manao sorona ny fampiharana mba hitazonana ny OS. Andeha hodinihintsika aloha ny fomba fiasan'ny OOM sy ny fomba hifehezana azy, ary avy eo hojerentsika ny fomba nanapahan'i OOM Killer izay fampiharana hatsahatra.

Ny iray amin'ireo asa lehibe amin'ny Linux dia ny manome fahatsiarovana ho an'ireo dingana rehefa mangataka izany izy ireo. Amin'ny ankapobeny, ny dingana na ny fampiharana dia mangataka fahatsiarovana amin'ny OS, saingy tsy mampiasa azy io tanteraka. Raha manome fahatsiarovana ho an'izay rehetra mangataka azy ny OS nefa tsy manana drafitra hampiasa azy io, dia ho lany ny fahatsiarovana ary tsy hahomby ny rafitra. Mba hisorohana izany, ny OS dia mitahiry fahatsiarovana ho an'ny dingana, fa tsy mamoaka izany. Ny fitadidiana dia tsy omena afa-tsy rehefa misy dingana iray tena hampiasa azy io. Mitranga izany fa tsy manana fahatsiarovana maimaim-poana ny OS, fa manome fitadidiana ho an'ny dingana iray, ary rehefa mila izany ny OS, dia atolotry ny OS izany raha azo atao. Ny lafy ratsiny dia indraindray ny OS dia mitahiry fahatsiarovana, fa amin'ny fotoana mety tsy misy fahatsiarovana maimaim-poana, ary ny rafitra mianjera. Ny OOM dia manana anjara toerana lehibe amin'ity toe-javatra ity ary mamarana ny dingana mba hisorohana ny kernel tsy hikorontana. Rehefa voatery hatsahatra ny dingana PostgreSQL dia misy hafatra miseho ao amin'ny log:

Out of Memory: Killed process 12345 (postgres).

Raha kely ny fitadidiana ny rafitra ary tsy azo afahana dia antsoina ny asa out_of_memory. Amin'ity dingana ity dia zavatra tokana sisa no ataony - mamita dingana iray na maromaro. Tokony hamarana ny dingana avy hatrany ve ny OOM-killer sa afaka miandry? Mazava ho azy fa rehefa antsoina hoe out_of_memory dia noho ny fiandrasana ny fandidiana I/O na ny paging amin'ny kapila. Noho izany, ny mpamono OOM dia tsy maintsy manao fisavana aloha ary, mifototra amin'izy ireo, dia manapa-kevitra fa mila atsahatra ny dingana. Raha tsara daholo ny fisavana etsy ambany dia hampitsahatra ny dingana ny OOM.

Fifantenana dingana

Rehefa lany ny fitadidiana dia antsoina ny asa out_of_memory(). Manana fiasa izany select_bad_process(), izay mahazo fanombanana avy amin'ny asa badness(). Ny dingana "ratsy indrindra" dia ho lasibatra. asa badness() mifidy dingana iray araka ny fitsipika sasany.

  1. Mila fitadidiana kely indrindra ho azy ny kernel.
  2. Mila manafaka fahatsiarovana be dia be ianao.
  3. Tsy ilaina ny manajanona ny dingana izay mampiasa fahatsiarovana kely.
  4. Mila vita ny dingana faran'izay kely indrindra.
  5. Algorithm saro-pady izay mampitombo ny mety ho vita ho an'ireo dingana izay tian'ny mpampiasa ho vita.

Rehefa vita ireo fanamarinana rehetra ireo, dia mandinika ny isa ny OOM (oom_score). Om assign oom_score dingana tsirairay, ary avy eo dia ampitomboina amin'ny habetsahan'ny fitadidiana io sanda io. Ny dingana misy sanda lehibe kokoa dia mety ho tratran'ny OOM Killer. Ny dingana mifandray amin'ny mpampiasa faka dia manana naoty ambany kokoa ary tsy dia voatery ho voatery hijanona.

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

Ny ID process Postgres dia 3813, noho izany amin'ny akora hafa dia azo atao ny maka ny isa amin'ny fampiasana an'io parameter kernel io oom_score:

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

Raha tsy tianao hamono ny dingana mihitsy ny OOM-Killer dia misy safidy kernel hafa: oom_score_adj. Manampia sanda ratsy lehibe mba hampihenana ny mety hahavitana dingana iray izay sarobidy aminao.

sudo echo -100 > /proc/3813/oom_score_adj

Hametraka sanda oom_score_adj, mametraka OOMScoreAdjust ao amin'ny sakana serivisy:

[Service]
OOMScoreAdjust=-1000

Na mampiasa oomprotect ao anaty ekipa rcctl.

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

Manery fampitsaharana dingana iray

Rehefa efa voafantina ny dingana iray na maromaro dia miantso ny fiasa ny OOM-Killer oom_kill_task(). Ity fiasa ity dia mandefa famantarana fampitsaharana amin'ny dingana. Raha sendra tsy fahampian'ny fitadidiana oom_kill() Miantso ity asa ity handefa famantarana SIGKILL amin'ny dingana. Misy hafatra voasoratra ao amin'ny log kernel.

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

Ahoana ny fifehezana ny OOM-Killer

Amin'ny Linux, azonao atao ny mamela na manafoana ny OOM-Killer (na dia tsy soso-kevitra aza ity farany). Ampiasao ny paramètre raha hampiasana na hampiato vm.oom-kill. Mba hahafahan'ny OOM-Killer amin'ny fotoana fandehanana dia araho ny baiko sysctl.

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

Mba hanesorana ny OOM-Killer, mariho ny sanda 0 amin'io baiko io ihany:

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

Ny vokatr'io baiko io dia tsy ho voavonjy mandrakizay, fa mandra-pahatongan'ny reboot voalohany. Raha mila fikirizana bebe kokoa ianao dia ampio ity andalana ity amin'ny rakitra /etc/sysctl.conf:

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

Ny fomba iray hafa ahafahana mamela sy manafoana dia ny fanoratana faribolana panic_on_oom. Azo jerena foana ny sandany /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Raha mametraka ny sanda ho 0 ianao, dia rehefa lany ny fitadidiana dia tsy hisy ny tahotra ny kernel.

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

Raha mametraka ny sanda ho 1 ianao, dia rehefa lany ny fitadidiana dia hisy korontana kernel.

echo 1 > /proc/sys/vm/panic_on_oom

Ny OOM-Killer dia tsy azo vonoina sy vonoina fotsiny. Efa nilaza izahay fa ny Linux dia afaka mitahiry fahatsiarovana bebe kokoa ho an'ny fizotry ny dingana raha tsy misy ny tena manokana, ary io fihetsika io dia fehezin'ny parameter kernel Linux. Ny variable no tompon'andraikitra amin'izany vm.overcommit_memory.

Azonao atao ny mamaritra ireto sanda manaraka ireto ho azy:

0: Ny kernel mihitsy no manapa-kevitra raha mitahiry fahatsiarovana be loatra. Ity no default amin'ny ankamaroan'ny dikan-teny Linux.
1: Ny kernel dia mitahiry fahatsiarovana fanampiny foana. Mampidi-doza izany, satria mety ho lany ny fitadidiana, satria, azo inoana, indray andro any dia mitaky izany ny fizotrany.
2: ny kernel dia tsy hitahiry fitadidiana mihoatra ny voalaza ao amin'ny parameter overcommit_ratio.

Amin'ny alalan'ity mari-pamantarana ity dia mamaritra ny isan-jaton'ny fitadidiana avela ho voatokana be loatra ianao. Raha tsy misy toerana ho azy dia tsy misy fahatsiarovana omena, ary ho lavina ny famandrihana. Ity no safidy azo antoka indrindra atolotra ho an'ny PostgreSQL. Ny OOM-Killer dia misy fiantraikany amin'ny singa iray hafa - ny fahafaha-mifamadika, izay fehezin'ny fari-piainana cat /proc/sys/vm/swappiness. Ireo soatoavina ireo dia milaza amin'ny kernel ny fomba fitantanana ny paging. Arakaraky ny ambony ny sandany, ny tsy dia azo inoana fa hampitsahatra ny dingana ny OOM, saingy noho ny fiasan'ny I/O dia misy fiantraikany ratsy amin'ny angon-drakitra izany. Ary ny mifamadika amin'izany - ny ambany ny sandany, ny avo kokoa ny mety hisian'ny fidirana an-tsehatra OOM-Killer, fa ny fahombiazan'ny angon-drakitra dia avo kokoa. Ny sandan'ny default dia 60, fa raha mifanaraka amin'ny fitadidiana ny angona manontolo dia tsara kokoa ny mametraka ny sanda ho 1.

vokatra

Aza avela hampatahotra anao ny "mpamono" ao amin'ny OOM-Killer. Amin'ity tranga ity, ny mpamono olona no ho mpamonjy ny rafitrao. "Mamono" ny dingana ratsy indrindra izy io ary mamonjy ny rafitra amin'ny fianjerana. Mba hialana amin'ny fampiasana OOM-Killer hamarana ny PostgreSQL, apetraho amin'ny vm.overcommit_memory sanda 2. Tsy miantoka izany fa tsy mila miditra an-tsehatra ny OOM-Killer, fa hampihena ny mety hanery ny fizotran'ny PostgreSQL hampitsahatra.

Source: www.habr.com

Add a comment