
ውስጥ ሲገባ 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() በተወሰኑ ህጎች መሰረት ሂደቱን ይመርጣል.
- ከርነል ለራሱ የተወሰነ አነስተኛ ማህደረ ትውስታ ይፈልጋል።
- ብዙ ማህደረ ትውስታን ነጻ ማድረግ ያስፈልግዎታል.
- ትንሽ ማህደረ ትውስታን የሚጠቀሙ ሂደቶችን ማቋረጥ አያስፈልግም.
- አነስተኛ ሂደቶችን ማጠናቀቅ ያስፈልጋል.
- ተጠቃሚው ራሱ ሊያጠናቅቃቸው የሚፈልጓቸውን ሂደቶች የማጠናቀቅ እድሎችን የሚጨምሩ ውስብስብ ስልተ ቀመሮች።
እነዚህን ሁሉ ፍተሻዎች ካጠናቀቀ በኋላ፣ 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
2OOM-ገዳይ ሂደቱን ጨርሶ እንዲገድል ካልፈለጉ፣ ሌላ የከርነል አማራጭ አለ፡- 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-ገዳይ እንዴት እንደሚቆጣጠር
В Linux OOM-Killerን ማንቃት ወይም ማሰናከል ይችላሉ (ምንም እንኳን የኋለኛው ባይመከርም)። ለማንቃት ወይም ለማሰናከል፣ መለኪያውን ይጠቀሙ vm.oom-kill. ኦኦኤም-ገዳይ በአሂድ ጊዜ ለማንቃት ትዕዛዙን ያሂዱ sysctl.
sudo -s sysctl -w vm.oom-kill = 1OOM-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-ገዳይ በሌላ አካል ተጎድቷል - በተለዋዋጭ ቁጥጥር የሚደረግበት የመለዋወጥ ችሎታ cat /proc/sys/vm/swappiness. እነዚህ እሴቶች ፔጅንግን እንዴት እንደሚይዙ ከርነል ይነግሩታል። እሴቱ ከፍ ባለ መጠን, OOM ሂደቱን የማቆም እድሉ ያነሰ ነው, ነገር ግን በ I/O ስራዎች ምክንያት በመረጃ ቋቱ ላይ አሉታዊ ተጽእኖ ይኖረዋል. እና በተቃራኒው - እሴቱ ዝቅተኛ ነው, የ OOM-ገዳይ ጣልቃገብነት እድሉ ከፍ ያለ ነው, ነገር ግን የውሂብ ጎታው አፈጻጸምም ከፍ ያለ ነው. ነባሪው እሴቱ 60 ነው፣ ነገር ግን ሙሉው ዳታቤዝ ከማህደረ ትውስታ ጋር የሚስማማ ከሆነ እሴቱን ወደ 1 ማቀናበሩ የተሻለ ነው።
ውጤቶች
በ OOM-ገዳይ ውስጥ ያለው "ገዳይ" እንዲያስፈራራህ አትፍቀድ። በዚህ ሁኔታ, ገዳይ የስርዓትዎ አዳኝ ይሆናል. በጣም መጥፎ የሆኑትን ሂደቶች "ይገድላል" እና ስርዓቱን ከመጥፋት ያድናል. PostgreSQLን ለማቋረጥ OOM-Killerን ላለመጠቀም፣ ወደዚህ ያቀናብሩ vm.overcommit_memory እሴት 2. ይህ OOM-ገዳይ ጣልቃ መግባት እንደሌለበት ዋስትና አይሰጥም፣ ነገር ግን የPostgreSQL ሂደት እንዲቋረጥ የማስገደድ እድልን ይቀንሳል።
ምንጭ: hab.com
