
Nuair a bhios e a-staigh Linux сервер базы данных непредвиденно завершает работу, нужно найти причину. Причин может быть несколько. Например, SIGSEGV - fàiligeadh ri linn buga san t-seirbheisiche backend. Ach tha seo tearc. Mar as trice, bidh thu dìreach a’ ruith a-mach à àite diosc no cuimhne. Ma ruitheas tu a-mach à àite diosc, chan eil ann ach aon dòigh a-mach - saor àite agus ath-thòisich an stòr-dàta.
Fear-marbhadh a-mach à cuimhne
Nuair a bhios tu frithealaiche или процесса заканчивается память, Linux предлагает 2 пути решения: обрушить всю систему или завершить процесс (приложение), который съедает память. Лучше, конечно, завершить процесс и спасти ОС от аварийного завершения. В двух словах, Out-Of-Memory Killer — это процесс, который завершает приложение, чтобы спасти ядро от сбоя. Он жертвует приложением, чтобы сохранить работу ОС. Давайте сначала обсудим, как работает OOM и как его контролировать, а потом посмотрим, как OOM Killer решает, какое приложение завершить.
Одна из главных задач Linux — выделять память процессам, когда они ее просят. Обычно процесс или приложение запрашивают у ОС память, а сами используют ее не полностью. Если ОС будет выдавать память всем, кто ее просит, но не планирует использовать, очень скоро память закончится, и система откажет. Чтобы этого избежать, ОС резервирует память за процессом, но фактически не выдает ее. Память выделяется, только когда процесс действительно собирается ее использовать. Случается, что у ОС нет свободной памяти, но она закрепляет память за процессом, и когда процессу она нужна, ОС выделяет ее, если может. Минус в том, что иногда ОС резервирует память, но в нужный момент свободной памяти нет, и происходит сбой системы. OOM играет важную роль в этом сценарии и завершает процессы, чтобы уберечь ядро от паники. Когда принудительно завершается процесс PostgreSQL, в логе появляется сообщение:
Out of Memory: Killed process 12345 (postgres).Ma tha an siostam ìosal air cuimhne agus nach gabh a shaoradh, canar an gnìomh ris out_of_memory. Aig an ìre seo, chan eil aice ach aon rud ri dhèanamh - crìoch a chur air aon phròiseas no barrachd. Am bu chòir do OOM-killer am pròiseas a thoirt gu crìch sa bhad no an urrainn dha feitheamh? Gu follaiseach, nuair a thèid out_of_memory a ghairm, tha e mar thoradh air feitheamh ri gnìomhachd I/O no paging gu diosc. Mar sin, feumaidh an neach-marbhadh OOM sgrùdaidhean a dhèanamh an-toiseach agus, stèidhichte orra, co-dhùnadh gum feumar am pròiseas a thoirt gu crìch. Ma tha na sgrùdaidhean gu h-ìosal deimhinneach, cuiridh OOM crìoch air a’ phròiseas.
Taghadh phròiseas
Nuair a ruitheas cuimhne a-mach, canar an gnìomh ris out_of_memory(). Tha gnìomh aige select_bad_process(), a gheibh measadh bhon ghnìomh badness(). Thèid am pròiseas “as miosa” a chuimseachadh. Gnìomh badness() taghadh pròiseas a rèir riaghailtean sònraichte.
- Feumaidh an kernel beagan cuimhne as lugha dha fhèin.
- Feumaidh tu tòrr cuimhne a shaoradh.
- Chan eil feum air crìoch a chur air pròiseasan a tha a 'cleachdadh glè bheag de chuimhne.
- Feumar pròiseasan as ìsle a chrìochnachadh.
- Algorithms iom-fhillte a tha a 'meudachadh chothroman crìochnachaidh airson na pròiseasan sin a tha an neach-cleachdaidh fhèin airson a chrìochnachadh.
Às deidh na sgrùdaidhean sin uile a chrìochnachadh, bidh OOM a’ sgrùdadh an sgòr (oom_score). OOM a’ cur an dreuchd oom_score gach pròiseas, agus an uairsin iomadachadh an luach seo leis an ìre de chuimhne. Tha pròiseasan le luachan nas motha nas dualtaiche fulang leis an OOM Killer. Tha sgòr nas ìsle aig pròiseasan co-cheangailte ris an neach-cleachdaidh bunaiteach agus chan eil iad cho dualtach a bhith air an èigneachadh gu crìch.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Is e ID pròiseas Postgres 3813, agus mar sin ann an slige eile tha e comasach an sgòr fhaighinn a’ cleachdadh am paramadair kernel seo oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Mura h-eil thu airson gun cuir OOM-Killer am pròiseas gu bàs idir, tha roghainn kernel eile ann: oom_score_adj. Cuir luach àicheil mòr ris gus na cothroman air crìoch a chur air pròiseas a tha thu a’ cur luach a lughdachadh.
sudo echo -100 > /proc/3813/oom_score_adjGus luach a shuidheachadh oom_score_adj, suidhich OOMScoreAdjust anns a’ bhloc seirbheis:
[Service]
OOMScoreAdjust=-1000No cleachd oomprotect ann an sgioba rcctl.
rcctl set <i>servicename</i> oomprotect -1000Feachd crìoch a chur air pròiseas
Nuair a tha aon phròiseas no barrachd air a thaghadh mar-thà, bidh OOM-Killer a 'gairm a' ghnìomh oom_kill_task(). Bidh an gnìomh seo a’ cur comharra crìochnachaidh chun phròiseas. Ann an cùis gainnead cuimhne oom_kill() A’ gairm a’ ghnìomh seo gus comharra SIGKILL a chuir chun phròiseas. Tha teachdaireachd air a sgrìobhadh chun log kernel.
Out of Memory: Killed process [pid] [name].Mar a chumas tu smachd air OOM-Killer
В Linux можно включать и отключать OOM-Killer (хотя последнее не рекомендуется). Для включения и отключения используйте параметр vm.oom-kill. Gus OOM-Killer a chomasachadh aig àm ruith, ruith an àithne sysctl.
sudo -s sysctl -w vm.oom-kill = 1Gus OOM-Killer a dhì-cheadachadh, sònraich an luach 0 san aon àithne:
sudo -s sysctl -w vm.oom-kill = 0Cha tèid toradh na h-àithne seo a shàbhaladh gu bràth, ach dìreach gus a’ chiad ath-thòiseachadh. Ma tha barrachd seasmhachd a dhìth ort, cuir an loidhne seo ris an fhaidhle /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confIs e dòigh eile air comas agus à comas caochladair a sgrìobhadh panic_on_oom. Faodar an luach a sgrùdadh an-còmhnaidh /proc.
$ cat /proc/sys/vm/panic_on_oom
0Ma shuidhicheas tu an luach gu 0, an uairsin nuair a ruitheas cuimhne a-mach, cha bhith clisgeadh kernel ann.
$ echo 0 > /proc/sys/vm/panic_on_oomMa shuidhicheas tu an luach gu 1, an uairsin nuair a ruitheas a’ chuimhne a-mach, thig clisgeadh kernel.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer можно не только включать и выключать. Мы уже говорили, что Linux может зарезервировать для процессов больше памяти, чем есть, но не выделять ее по факту, и этим поведением управляет параметр ядра Linux. За это отвечает переменная vm.overcommit_memory.
Faodaidh tu na luachan a leanas a shònrachadh air a shon:
0: ядро само решает, стоит ли резервировать слишком много памяти. Это значение по умолчанию в большинстве версий Linux.
1: Bidh an kernel an-còmhnaidh a’ gleidheadh cuimhne a bharrachd. Tha seo cunnartach, oir faodaidh an cuimhne ruith a-mach, oir, as coltaiche, aon latha bidh feum aig na pròiseasan air.
2: cha ghlèidh an kernel barrachd cuimhne na tha air a shònrachadh sa pharameter overcommit_ratio.
Leis a 'pharaiméadar seo, bidh thu a' sònrachadh an àireamh sa cheud de chuimhne a tha ceadaichte a bhith ro-ghlèidhte. Mura h-eil àite ann air a shon, chan eil cuimhne air a riarachadh, agus thèid an glèidheadh a dhiùltadh. Is e seo an roghainn as sàbhailte a thathar a’ moladh airson PostgreSQL. Tha eileamaid eile a’ toirt buaidh air OOM-Killer - an comas suaipidh, a tha fo smachd an caochlaideach cat /proc/sys/vm/swappiness. Tha na luachan sin ag innse don kernel mar a làimhsicheas tu paging. Mar as àirde an luach, is ann as dualtaiche a tha e gun cuir OOM crìoch air a’ phròiseas, ach mar thoradh air gnìomhachd I / O tha droch bhuaidh aige air an stòr-dàta. Agus a chaochladh - mar as ìsle an luach, is ann as àirde an coltas gum bi eadar-theachd OOM-Killer, ach tha coileanadh an stòr-dàta nas àirde cuideachd. Is e 60 an luach bunaiteach, ach ma tha an stòr-dàta gu lèir a’ freagairt air cuimhne, tha e nas fheàrr an luach a shuidheachadh gu 1.
Builean
Na leig leis an “marbhadh” ann an OOM-Killer eagal a chuir ort. Anns a ’chùis seo, bidh am marbhadh na fhear-saoraidh don t-siostam agad. Bidh e “a’ marbhadh ”na pròiseasan as miosa agus a’ sàbhaladh an t-siostam bho bhith a ’tuiteam. Gus nach fheum thu OOM-Killer a chleachdadh gus crìoch a chuir air PostgreSQL, suidhichte gu vm.overcommit_memory luach 2. Chan eil seo a’ gealltainn nach fheum OOM-Killer eadar-theachd a dhèanamh, ach lughdaichidh e an coltas gun toir e air pròiseas PostgreSQL crìochnachadh.
Source: www.habr.com
