PostgreSQL-д зориулсан Линукс дээр санах ойгүй алуурчин тохируулах

PostgreSQL-д зориулсан Линукс дээр санах ойгүй алуурчин тохируулах

Линукс дээр өгөгдлийн сангийн сервер гэнэт унтарвал шалтгааныг нь олох хэрэгтэй. Хэд хэдэн шалтгаан байж болно. Жишээлбэл, SIGSEGV — арын серверийн алдааны улмаас бүтэлгүйтсэн. Гэхдээ энэ нь ховор тохиолддог. Ихэнх тохиолдолд таны дискний зай эсвэл санах ой дуусдаг. Хэрэв таны дискний зай дуусвал гарах цорын ганц арга зам бий - зай гаргаж, мэдээллийн санг дахин эхлүүлнэ үү.

Санах ойгүй алуурчин

Сервер эсвэл процессын санах ой дуусах үед Линукс хоёр шийдлийг санал болгодог: системийг бүхэлд нь сүйрүүлэх эсвэл санах ойг идэж буй процессыг (програмыг) зогсоох. Мэдээжийн хэрэг процессыг зогсоож, үйлдлийн системийг эвдрэлээс аврах нь дээр. Товчхондоо Out-Of-Memory Killer нь цөмийг эвдрэлээс аврахын тулд програмыг устгадаг процесс юм. Энэ нь үйлдлийн системийг ажиллуулахын тулд програмыг золиослодог. Эхлээд OOM хэрхэн ажилладаг, түүнийг хэрхэн хянах талаар ярилцаад дараа нь OOM Killer ямар програмыг цуцлахаа хэрхэн шийддэгийг харцгаая.

Линуксийн гол ажлуудын нэг нь санах ойг процессууд хүсэх үед хуваарилах явдал юм. Ерөнхийдөө процесс эсвэл програм нь үйлдлийн системээс санах ойг хүсдэг боловч бүрэн ашигладаггүй. Хэрэв OS нь санах ойг хүссэн хүн бүрт өгөх боловч үүнийг ашиглахаар төлөвлөөгүй бол тун удахгүй санах ой дуусч, систем амжилтгүй болно. Үүнээс зайлсхийхийн тулд үйлдлийн систем нь санах ойг процесст зориулж нөөцөлдөг боловч үнэндээ үүнийг гаргадаггүй. Санах ойг зөвхөн процесс ашиглах гэж байгаа үед л хуваарилдаг. Үйлдлийн систем нь сул санах ойгүй байдаг ч процесст санах ойг хуваарилдаг бөгөөд хэрэв процесс шаардлагатай бол үйлдлийн систем боломжтой бол түүнийг хуваарилдаг. Сул тал нь заримдаа үйлдлийн систем нь санах ойг нөөцөлдөг боловч зөв цагт санах ой байхгүй, систем гацдаг. OOM нь энэ хувилбарт чухал үүрэг гүйцэтгэдэг бөгөөд цөмийг сандрахаас сэргийлэхийн тулд процессуудыг зогсооно. PostgreSQL процессыг албадан зогсоох үед бүртгэлд зурвас гарч ирнэ:

Out of Memory: Killed process 12345 (postgres).

Хэрэв системийн санах ой бага байгаа бөгөөд түүнийг суллах боломжгүй бол функцийг дуудна out_of_memory. Энэ үе шатанд түүнд хийх цорын ганц зүйл үлдсэн - нэг буюу хэд хэдэн процессыг дуусгах. OOM-алуурчин үйл явцыг нэн даруй зогсоох ёстой юу эсвэл хүлээж чадах уу? Мэдээжийн хэрэг, санах ойгүй гэж дуудагдах үед энэ нь I/O үйлдлийг хүлээх эсвэл диск рүү пейжинг хийхтэй холбоотой юм. Тиймээс, OOM алуурчин эхлээд шалгалт хийж, тэдгээрт үндэслэн үйл явцыг зогсоох шаардлагатай гэдгийг шийдэх ёстой. Хэрэв доорх бүх шалгалт эерэг байвал OOM үйл явцыг зогсооно.

Процессын сонголт

Санах ой дуусах үед функц дуудагдана out_of_memory(). Энэ нь функцтэй select_bad_process(), энэ нь функцээс үнэлгээ авдаг badness(). "Хамгийн муу" үйл явц онилно. Чиг үүрэг badness() тодорхой дүрмийн дагуу үйл явцыг сонгодог.

  1. Цөмд өөртөө хамгийн бага санах ой хэрэгтэй.
  2. Та маш их санах ойг суллах хэрэгтэй.
  3. Бага санах ой ашигладаг процессуудыг зогсоох шаардлагагүй.
  4. Хамгийн бага процессуудыг дуусгах шаардлагатай.
  5. Хэрэглэгч өөрөө дуусгахыг хүссэн процессуудыг дуусгах боломжийг нэмэгдүүлдэг нарийн төвөгтэй алгоритмууд.

Эдгээр бүх шалгалтыг дуусгасны дараа OOM оноог шалгана (oom_score). OOM хуваарилдаг oom_score процесс бүр, дараа нь энэ утгыг санах ойн хэмжээгээр үржүүлнэ. Илүү том утгатай процессууд нь OOM Killer-ийн хохирогч болох магадлал өндөр байдаг. Үндсэн хэрэглэгчтэй холбоотой процессууд нь бага оноотой бөгөөд албадан дуусгах магадлал бага байдаг.

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

Postgres процессын ID нь 3813 тул өөр бүрхүүлд энэ цөмийн параметрийг ашиглан оноо авах боломжтой. oom_score:

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

Хэрэв та OOM-Killer-ийг процессыг огт устгахыг хүсэхгүй байгаа бол цөмийн өөр сонголт байна: oom_score_adj. Таны үнэлдэг үйл явцыг дуусгах боломжийг багасгахын тулд их хэмжээний сөрөг утгыг нэмнэ үү.

sudo echo -100 > /proc/3813/oom_score_adj

Утга тогтоохын тулд oom_score_adj, үйлчилгээний блок дотор OOMScoreAdjust тохируулна уу:

[Service]
OOMScoreAdjust=-1000

Эсвэл ашиглах oomprotect багт rcctl.

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

Процессыг хүчээр зогсоох

Нэг буюу хэд хэдэн процесс аль хэдийн сонгогдсон үед OOM-Killer функцийг дууддаг oom_kill_task(). Энэ функц нь процессыг дуусгах дохиог илгээдэг. Санах ойн хомсдолтой тохиолдолд oom_kill() Процесс руу SIGKILL дохио илгээхийн тулд энэ функцийг дууддаг. Цөмийн бүртгэлд мессеж бичигдсэн.

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

OOM-Killer-ийг хэрхэн хянах вэ

Линукс дээр та OOM-Killer-г идэвхжүүлж эсвэл идэвхгүй болгож болно (хэдийгээр сүүлийнхийг ашиглахыг зөвлөдөггүй). Идэвхжүүлэх эсвэл идэвхгүй болгохын тулд параметрийг ашиглана уу vm.oom-kill. OOM-Killer-г ажиллуулах үед идэвхжүүлэхийн тулд тушаалыг ажиллуулна уу sysctl.

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

OOM-Killer-ийг идэвхгүй болгохын тулд ижил тушаалд 0 утгыг зааж өгнө үү:

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

Энэ тушаалын үр дүн үүрд хадгалагдахгүй, гэхдээ зөвхөн эхний дахин ачаалах хүртэл. Хэрэв танд илүү тэвчээр хэрэгтэй бол энэ мөрийг файлд нэмнэ үү /etc/sysctl.conf:

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

Идэвхжүүлэх, идэвхгүй болгох өөр нэг арга бол хувьсагч бичих явдал юм panic_on_oom. Утгыг үргэлж шалгаж болно /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Хэрэв та утгыг 0 болговол санах ой дуусах үед цөмийн сандрал байхгүй болно.

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

Хэрэв та утгыг 1 гэж тохируулсан бол санах ой дуусах үед цөмийн үймээн үүснэ.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer нь зөвхөн асаах, унтраах боломжгүй юм. Бид өмнө нь Линукс нь процесст зориулж байгаа санах ойгоос илүү их санах ойг хуваарилахгүйгээр нөөцлөх боломжтой бөгөөд энэ үйлдлийг Линуксийн цөмийн параметрээр удирддаг гэж бид аль хэдийн хэлсэн. Хувьсагч нь үүнийг хариуцдаг vm.overcommit_memory.

Та үүнд дараах утгыг зааж өгч болно.

0: Хэт их санах ойг нөөцлөх эсэхийг цөм өөрөө шийддэг. Энэ нь Линуксийн ихэнх хувилбаруудад анхдагч юм.
1: Цөм нь үргэлж нэмэлт санах ойг нөөцлөх болно. Энэ нь эрсдэлтэй, учир нь санах ой дуусч магадгүй, учир нь нэг өдөр процессууд үүнийг шаардах болно.
2: цөм нь параметрт заасан хэмжээнээс илүү санах ойг хадгалахгүй overcommit_ratio.

Энэ параметрийн тусламжтайгаар та хэт нөөцлөхийг зөвшөөрсөн санах ойн хувийг зааж өгнө. Хэрэв зай байхгүй бол санах ой хуваарилагдахгүй бөгөөд захиалга өгөхөөс татгалзах болно. Энэ бол PostgreSQL-д санал болгож буй хамгийн найдвартай сонголт юм. OOM-Killer-д өөр нэг элемент нөлөөлдөг - хувьсагчаар удирддаг солих чадвар. cat /proc/sys/vm/swappiness. Эдгээр утгууд нь цөмд пейжинг хэрхэн зохицуулахыг хэлж өгдөг. Утга өндөр байх тусам OOM нь процессыг зогсоох магадлал бага боловч I/O үйлдлүүдийн улмаас мэдээллийн санд сөрөг нөлөө үзүүлдэг. Мөн эсрэгээр - утга бага байх тусам OOM-Killer хөндлөнгийн оролцоо өндөр байх болно, гэхдээ мэдээллийн баазын гүйцэтгэл өндөр байна. Өгөгдмөл утга нь 60, гэхдээ мэдээллийн сан бүхэлдээ санах ойд багтах бол утгыг 1 болгох нь дээр.

Үр дүн

OOM-Killer дахь "алуурчин" таныг айлгахыг бүү зөвшөөр. Энэ тохиолдолд алуурчин таны системийн аврагч байх болно. Энэ нь хамгийн муу процессуудыг "алж", системийг сүйрлээс авардаг. PostgreSQL-г дуусгахын тулд OOM-Killer ашиглахаас зайлсхийхийн тулд тохируулна уу vm.overcommit_memory утга 2. Энэ нь OOM-Killer хөндлөнгөөс оролцох шаардлагагүй гэсэн баталгаа биш боловч PostgreSQL процессыг албадан зогсоох магадлалыг бууруулна.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх