ለPostgreSQL በሊኑክስ ላይ ከማህደረ ትውስታ ውጪ ገዳይን በማዋቀር ላይ

ለPostgreSQL በሊኑክስ ላይ ከማህደረ ትውስታ ውጪ ገዳይን በማዋቀር ላይ

የውሂብ ጎታ አገልጋይ በሊኑክስ ውስጥ በድንገት ሲያቆም ምክንያቱን ማግኘት አለቦት። በርካታ ምክንያቶች ሊኖሩ ይችላሉ። ለምሳሌ, SIGSEGV - በኋለኛው አገልጋይ ውስጥ ባለ ስህተት ምክንያት አለመሳካቱ። ይህ ግን ብርቅ ነው። ብዙ ጊዜ፣ በቀላሉ የዲስክ ቦታ ወይም ማህደረ ትውስታ አልቆብሃል። የዲስክ ቦታ ካለቀብዎ መውጫው አንድ መንገድ ብቻ ነው - ቦታ ያስለቅቁ እና የውሂብ ጎታውን እንደገና ያስጀምሩ።

ከትውስታ ውጪ ገዳይ

አንድ አገልጋይ ወይም ሂደት የማስታወስ ችሎታ ሲያልቅ ሊኑክስ 2 መፍትሄዎችን ይሰጣል፡ መላውን ሲስተም ይሰብራል ወይም ማህደረ ትውስታን የሚበላውን ሂደት (መተግበሪያ) ያቋርጣል። እርግጥ ነው, ሂደቱን ማቋረጥ እና ስርዓተ ክወናውን ከብልሽት ማዳን የተሻለ ነው. ባጭሩ ከትውስታ ውጪ ገዳይ ከርነል ከብልሽት ለማዳን አፕሊኬሽን የሚገድል ሂደት ነው። ስርዓተ ክወናው እንዲሰራ ለማድረግ መተግበሪያውን ይሠዋዋል። በመጀመሪያ ኦኦኤም እንዴት እንደሚሰራ እና እንዴት መቆጣጠር እንደሚቻል እንወያይ እና ከዚያም የ OOM ገዳይ የትኛውን ማመልከቻ እንደሚያቋርጥ እንደሚወስን እንይ።

የሊኑክስ ዋና ተግባራት አንዱ ማህደረ ትውስታን ሲጠይቁ ሂደቶችን መመደብ ነው. በተለምዶ አንድ ሂደት ወይም መተግበሪያ ከስርዓተ ክወናው ማህደረ ትውስታን ይጠይቃል, ግን ሙሉ በሙሉ አይጠቀምበትም. ስርዓተ ክወናው ማህደረ ትውስታን ለሚጠይቀው ሁሉ ቢሰጥ ግን ለመጠቀም እቅድ ከሌለው በጣም በቅርብ ጊዜ ማህደረ ትውስታው ያበቃል እና ስርዓቱ አይሳካም. ይህንን ለማስቀረት ስርዓተ ክወናው ለሂደቱ ማህደረ ትውስታን ያስቀምጣል, ነገር ግን በትክክል አይለቀውም. የማስታወስ ችሎታ የሚከፋፈለው አንድ ሂደት በትክክል ጥቅም ላይ ሲውል ብቻ ነው። ኦኤስ ነፃ ማህደረ ትውስታ ከሌለው ይከሰታል ፣ ግን ማህደረ ትውስታን ለአንድ ሂደት ይመድባል ፣ እና አንድ ሂደት ሲፈልግ 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 ገዳይ ሰለባ የመሆን ዕድላቸው ከፍተኛ ነው። ከስር ተጠቃሚው ጋር የተያያዙ ሂደቶች ዝቅተኛ ነጥብ አላቸው እና ለማቋረጥ የመገደድ ዕድላቸው አነስተኛ ነው።

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

የ Postgres ሂደት መታወቂያ 3813 ነው፣ ስለዚህ በሌላ ሼል ውስጥ ይህንን የከርነል መለኪያ በመጠቀም ውጤቱን ማግኘት ይቻላል oom_score:

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

OOM-ገዳይ ሂደቱን ጨርሶ እንዲገድል ካልፈለጉ፣ ሌላ የከርነል አማራጭ አለ፡- oom_score_adj. ዋጋ የሚሰጡትን ሂደት የማጠናቀቅ እድሎችን ለመቀነስ ትልቅ አሉታዊ እሴት ይጨምሩ።

sudo echo -100 > /proc/3813/oom_score_adj

እሴት ለማዘጋጀት oom_score_adjበአገልግሎት ብሎክ ውስጥ OOMScore አስተካክል ያዘጋጁ፡-

[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-ገዳይ እንዴት እንደሚቆጣጠር

በሊኑክስ ላይ OOM-Killerን ማንቃት ወይም ማሰናከል ይችላሉ (ምንም እንኳን የኋለኛው አይመከርም)። ለማንቃት ወይም ለማሰናከል መለኪያውን ይጠቀሙ vm.oom-kill. ኦኦኤም-ገዳይ በአሂድ ጊዜ ለማንቃት ትዕዛዙን ያሂዱ 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-ገዳይ ማብራት እና ማጥፋት ብቻ አይደለም። ሊኑክስ በትክክል ሳይመደብ ለሂደቶች የበለጠ ማህደረ ትውስታን እንደሚያከማች አስቀድመን ተናግረናል፣ እና ይህ ባህሪ የሚቆጣጠረው በሊኑክስ ከርነል መለኪያ ነው። ተለዋዋጭው ለዚህ ተጠያቂ ነው vm.overcommit_memory.

ለእሱ የሚከተሉትን እሴቶች መግለጽ ይችላሉ-

0: ከርነሉ ራሱ ብዙ ማህደረ ትውስታ መያዙን ይወስናል። ይህ በአብዛኛዎቹ የሊኑክስ ስሪቶች ላይ ያለው ነባሪ ነው።
1: ከርነል ሁልጊዜ ተጨማሪ ማህደረ ትውስታን ያስቀምጣል. ይህ አደገኛ ነው, ምክንያቱም ማህደረ ትውስታው ሊያልቅ ይችላል, ምክንያቱም ምናልባትም, አንድ ቀን ሂደቶቹ ይጠይቃሉ.
2: ከርነል በመለኪያው ውስጥ ከተጠቀሰው በላይ ማህደረ ትውስታን አያከማችም። overcommit_ratio.

በዚህ ግቤት፣ ከመጠን በላይ እንዲቀመጥ የሚፈቀደውን የማህደረ ትውስታ መቶኛን ይገልፃሉ። ለእሱ ምንም ቦታ ከሌለ, ምንም ማህደረ ትውስታ አልተመደበም, እና ቦታ ማስያዝ ይከለክላል. ይህ ለ PostgreSQL የሚመከር በጣም አስተማማኝ አማራጭ ነው። OOM-ገዳይ በሌላ አካል ተጎድቷል - በተለዋዋጭ ቁጥጥር የሚደረግበት የመለዋወጥ ችሎታ cat /proc/sys/vm/swappiness. እነዚህ እሴቶች ፔጅንግን እንዴት እንደሚይዙ ከርነል ይነግሩታል። እሴቱ ከፍ ባለ መጠን, OOM ሂደቱን የማቆም እድሉ ያነሰ ነው, ነገር ግን በ I/O ስራዎች ምክንያት በመረጃ ቋቱ ላይ አሉታዊ ተጽእኖ ይኖረዋል. እና በተቃራኒው - እሴቱ ዝቅተኛ ነው, የ OOM-ገዳይ ጣልቃገብነት እድሉ ከፍ ያለ ነው, ነገር ግን የውሂብ ጎታው አፈጻጸምም ከፍ ያለ ነው. ነባሪው እሴቱ 60 ነው፣ ነገር ግን ሙሉው ዳታቤዝ ከማህደረ ትውስታ ጋር የሚስማማ ከሆነ እሴቱን ወደ 1 ማቀናበሩ የተሻለ ነው።

ውጤቶች

በ OOM-ገዳይ ውስጥ ያለው "ገዳይ" እንዲያስፈራራህ አትፍቀድ። በዚህ ሁኔታ, ገዳይ የስርዓትዎ አዳኝ ይሆናል. በጣም መጥፎ የሆኑትን ሂደቶች "ይገድላል" እና ስርዓቱን ከመጥፋት ያድናል. PostgreSQLን ለማቋረጥ OOM-Killerን ላለመጠቀም፣ ወደዚህ ያቀናብሩ vm.overcommit_memory እሴት 2. ይህ OOM-ገዳይ ጣልቃ መግባት እንደሌለበት ዋስትና አይሰጥም፣ ነገር ግን የPostgreSQL ሂደት እንዲቋረጥ የማስገደድ እድልን ይቀንሳል።

ምንጭ: hab.com

አስተያየት ያክሉ