PostgreSQL க்காக லினக்ஸில் அவுட்-ஆஃப்-மெமரி கில்லரை அமைக்கிறது

PostgreSQL க்காக லினக்ஸில் அவுட்-ஆஃப்-மெமரி கில்லரை அமைக்கிறது

லினக்ஸில் ஒரு தரவுத்தள சேவையகம் எதிர்பாராதவிதமாக வெளியேறும் போது, ​​அதற்கான காரணத்தை நீங்கள் கண்டுபிடிக்க வேண்டும். பல காரணங்கள் இருக்கலாம். உதாரணத்திற்கு, SIGSEGV - பின்தள சேவையகத்தில் ஏற்பட்ட பிழை காரணமாக தோல்வி. ஆனால் இது அரிது. பெரும்பாலும், உங்கள் வட்டு இடம் அல்லது நினைவகம் தீர்ந்துவிடும். உங்களிடம் வட்டு இடம் இல்லை என்றால், ஒரே ஒரு வழி இருக்கிறது - இடத்தை காலி செய்து தரவுத்தளத்தை மறுதொடக்கம் செய்யுங்கள்.

ஞாபக சக்திக்கு அப்பாற்பட்ட கொலையாளி

ஒரு சர்வர் அல்லது செயல்முறை நினைவகம் தீர்ந்துவிட்டால், லினக்ஸ் 2 தீர்வுகளை வழங்குகிறது: முழு கணினியையும் செயலிழக்கச் செய்யவும் அல்லது நினைவகத்தை அழிக்கும் செயல்முறையை (பயன்பாடு) நிறுத்தவும். நிச்சயமாக, செயல்முறையை நிறுத்தி, OS ஐ செயலிழக்காமல் காப்பாற்றுவது நல்லது. சுருக்கமாக, அவுட்-ஆஃப்-மெமரி கில்லர் என்பது கர்னலை செயலிழக்காமல் காப்பாற்ற ஒரு பயன்பாட்டைக் கொல்லும் ஒரு செயல்முறையாகும். OS இயங்குவதற்கு இது பயன்பாட்டை தியாகம் செய்கிறது. முதலில் OOM எவ்வாறு செயல்படுகிறது மற்றும் அதை எவ்வாறு கட்டுப்படுத்துவது என்பதைப் பற்றி விவாதிப்போம், பின்னர் OOM கில்லர் எந்த பயன்பாட்டை நிறுத்த வேண்டும் என்பதை எப்படி முடிவு செய்கிறார் என்பதைப் பார்ப்போம்.

லினக்ஸின் முக்கிய பணிகளில் ஒன்று, செயல்முறைகள் கேட்கும்போது நினைவகத்தை ஒதுக்குவது. பொதுவாக, ஒரு செயல்முறை அல்லது பயன்பாடு OS இலிருந்து நினைவகத்தைக் கோருகிறது, ஆனால் அதை முழுமையாகப் பயன்படுத்தாது. OS நினைவகத்தைக் கேட்கும் அனைவருக்கும் வழங்கினால், அதைப் பயன்படுத்தத் திட்டமிடவில்லை என்றால், மிக விரைவில் நினைவகம் தீர்ந்துவிடும் மற்றும் கணினி தோல்வியடையும். இதைத் தவிர்க்க, OS செயல்பாட்டிற்கு நினைவகத்தை ஒதுக்குகிறது, ஆனால் உண்மையில் அதை வெளியிடாது. ஒரு செயல்முறை உண்மையில் அதைப் பயன்படுத்தப் போகும் போது மட்டுமே நினைவகம் ஒதுக்கப்படுகிறது. OS க்கு இலவச நினைவகம் இல்லை, ஆனால் அது ஒரு செயல்முறைக்கு நினைவகத்தை ஒதுக்குகிறது, மேலும் ஒரு செயல்முறைக்குத் தேவைப்படும்போது, ​​OS அதை ஒதுக்குகிறது. எதிர்மறையானது சில நேரங்களில் OS நினைவகத்தை சேமிக்கிறது, ஆனால் சரியான நேரத்தில் இலவச நினைவகம் இல்லை, மேலும் கணினி செயலிழக்கிறது. இந்த சூழ்நிலையில் OOM முக்கிய பங்கு வகிக்கிறது மற்றும் கர்னல் பீதி அடையாமல் தடுக்க செயல்முறைகளை நிறுத்துகிறது. PostgreSQL செயல்முறையை நிறுத்த வேண்டிய கட்டாயம் ஏற்படும் போது, ​​பதிவில் ஒரு செய்தி தோன்றும்:

Out of Memory: Killed process 12345 (postgres).

கணினி நினைவகத்தில் குறைவாக இருந்தால், அதை விடுவிக்க முடியாவிட்டால், செயல்பாடு அழைக்கப்படுகிறது out_of_memory. இந்த கட்டத்தில், அவளுக்கு ஒரே ஒரு விஷயம் மட்டுமே உள்ளது - ஒன்று அல்லது அதற்கு மேற்பட்ட செயல்முறைகளை முடிக்கவும். OOM-கில்லர் செயல்முறையை உடனடியாக நிறுத்த வேண்டுமா அல்லது காத்திருக்க முடியுமா? வெளிப்படையாக, out_of_memory என்று அழைக்கப்படும் போது, ​​அது 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, சேவைத் தொகுதியில் OOMScoreAdjust ஐ அமைக்கவும்:

[Service]
OOMScoreAdjust=-1000

அல்லது பயன்படுத்தவும் oomprotect ஒரு அணியில் rcctl.

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

ஒரு செயல்முறையை கட்டாயமாக நிறுத்துதல்

ஒன்று அல்லது அதற்கு மேற்பட்ட செயல்முறைகள் ஏற்கனவே தேர்ந்தெடுக்கப்பட்டால், OOM-கில்லர் செயல்பாட்டை அழைக்கிறது oom_kill_task(). இந்த செயல்பாடு செயல்முறைக்கு ஒரு முடிவுக்கு சமிக்ஞையை அனுப்புகிறது. நினைவக பற்றாக்குறை ஏற்பட்டால் oom_kill() செயல்முறைக்கு SIGKILL சமிக்ஞையை அனுப்ப இந்தச் செயல்பாட்டை அழைக்கிறது. கர்னல் பதிவில் ஒரு செய்தி எழுதப்பட்டது.

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

OOM-கில்லரை எவ்வாறு கட்டுப்படுத்துவது

லினக்ஸில், நீங்கள் OOM-கில்லரை இயக்கலாம் அல்லது முடக்கலாம் (பிந்தையது பரிந்துரைக்கப்படவில்லை என்றாலும்). இயக்க அல்லது முடக்க அளவுருவைப் பயன்படுத்தவும் vm.oom-kill. இயக்க நேரத்தில் OOM-கில்லரை இயக்க, கட்டளையை இயக்கவும் 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-கில்லர் மட்டும் ஆன் மற்றும் ஆஃப் செய்ய முடியாது. Linux ஆனது நடைமுறையில் உள்ளதை விட அதிக நினைவகத்தை செயல்முறைகளுக்காக ஒதுக்க முடியும் என்று நாங்கள் ஏற்கனவே கூறியுள்ளோம், மேலும் இந்த நடத்தை Linux கர்னல் அளவுருவால் கட்டுப்படுத்தப்படுகிறது. இதற்கு மாறி தான் காரணம் vm.overcommit_memory.

அதற்கான பின்வரும் மதிப்புகளை நீங்கள் குறிப்பிடலாம்:

0: அதிக நினைவகத்தை ஒதுக்க வேண்டுமா என்பதை கர்னலே தீர்மானிக்கிறது. லினக்ஸின் பெரும்பாலான பதிப்புகளில் இது இயல்புநிலையாகும்.
1: கர்னல் எப்போதும் கூடுதல் நினைவகத்தை சேமிக்கும். இது ஆபத்தானது, ஏனென்றால் நினைவகம் தீர்ந்துவிடும், ஏனெனில், பெரும்பாலும், ஒரு நாள் செயல்முறைகள் தேவைப்படும்.
2: அளவுருவில் குறிப்பிடப்பட்டுள்ளதை விட கர்னல் அதிக நினைவகத்தை சேமிக்காது overcommit_ratio.

இந்த அளவுருவின் மூலம், அதிகமாக ஒதுக்கப்பட்ட நினைவகத்தின் சதவீதத்தை நீங்கள் குறிப்பிடுகிறீர்கள். அதற்கு இடமில்லை என்றால், நினைவகம் ஒதுக்கப்படவில்லை, இடஒதுக்கீடு மறுக்கப்படும். இது PostgreSQL க்கு பரிந்துரைக்கப்படும் பாதுகாப்பான விருப்பமாகும். OOM-கில்லர் மற்றொரு உறுப்பு மூலம் பாதிக்கப்படுகிறது - மாற்றும் திறன், இது மாறியால் கட்டுப்படுத்தப்படுகிறது cat /proc/sys/vm/swappiness. இந்த மதிப்புகள் கர்னலுக்கு பேஜிங்கை எவ்வாறு கையாள்வது என்று கூறுகின்றன. அதிக மதிப்பு, OOM செயல்முறையை நிறுத்தும் வாய்ப்பு குறைவு, ஆனால் I/O செயல்பாடுகள் காரணமாக அது தரவுத்தளத்தில் எதிர்மறையான தாக்கத்தை ஏற்படுத்துகிறது. மற்றும் நேர்மாறாக - குறைந்த மதிப்பு, OOM-கில்லர் தலையீட்டின் அதிக வாய்ப்பு, ஆனால் தரவுத்தள செயல்திறன் அதிகமாக உள்ளது. இயல்புநிலை மதிப்பு 60, ஆனால் முழு தரவுத்தளமும் நினைவகத்தில் பொருந்தினால், மதிப்பை 1 ஆக அமைப்பது நல்லது.

முடிவுகளை

OOM-கில்லரில் உள்ள "கொலையாளி" உங்களை பயமுறுத்த வேண்டாம். இந்த வழக்கில், கொலையாளி உங்கள் அமைப்பின் மீட்பராக இருப்பார். இது மோசமான செயல்முறைகளை "கொல்லுகிறது" மற்றும் செயலிழப்பிலிருந்து கணினியை காப்பாற்றுகிறது. PostgreSQL ஐ நிறுத்த OOM-கில்லரைப் பயன்படுத்துவதைத் தவிர்க்க, அமைக்கவும் vm.overcommit_memory மதிப்பு 2. OOM-கில்லர் தலையிட வேண்டியதில்லை என்பதற்கு இது உத்தரவாதம் அளிக்காது, ஆனால் இது PostgreSQL செயல்முறையை கட்டாயப்படுத்தி நிறுத்துவதற்கான வாய்ப்பைக் குறைக்கும்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்