Санах ойгүй болсон алуурчныг тохируулах нь Linux PostgreSQL-д зориулсан

Санах ойгүй болсон алуурчныг тохируулах нь Linux PostgreSQL-д зориулсан

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

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

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

Гол ажлуудын нэг Linux — Процессууд хүссэн үед нь санах ойг хуваарилах. Ихэвчлэн процесс эсвэл програм нь үйлдлийн системээс санах ой хүсдэг боловч бүрэн ашигладаггүй. Хэрэв үйлдлийн систем нь санах ой хүссэн боловч ашиглахаар төлөвлөөгүй бүх хүнд санах ой хуваарилбал систем хурдан санах ойгүй болж, систем гацах болно. Үүнээс урьдчилан сэргийлэхийн тулд үйлдлийн систем нь процесст зориулж санах ойг нөөцөлдөг боловч үнэндээ хуваарилдаггүй. Санах ойг зөвхөн процесс үнэхээр ашиглахаар төлөвлөж байгаа үед л хуваарилдаг. Заримдаа үйлдлийн системд сул санах ой байдаггүй ч процесст санах ой хуваарилдаг бөгөөд процесст шаардлагатай үед үйлдлийн систем боломжтой бол хуваарилдаг. Сул тал нь заримдаа үйлдлийн систем санах ойг нөөцөлдөг боловч шаардлагатай үед сул санах ой байхгүй тул системийн гацалт үүсгэдэг. 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-ийг хэрхэн хянах вэ

В Linux Та 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-ийг асааж, унтрааж болно. Linux боломжтой хэмжээнээс илүү их санах ойг процессуудад нөөцөлж болох боловч үнэндээ хуваарилж чадахгүй бөгөөд энэ зан төлөвийг цөмийн параметрээр хянадаг LinuxХувьсагч нь үүнийг хариуцдаг. vm.overcommit_memory.

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

0: Цөм нь хэт их санах ой нөөцлөх эсэхийг өөрөө шийддэг. Энэ нь ихэнх хувилбаруудад анхдагч утга юм. Linux.
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

DDoS хамгаалалт, VPS VDS сервер бүхий сайтуудад найдвартай хостинг худалдаж аваарай 🔥 DDoS хамгаалалттай, VPS VDS сервертэй найдвартай вэбсайт хостинг худалдаж аваарай | ProHoster