நினைவகப் பற்றாக்குறை கொலையாளியை அமைத்தல் Linux PostgreSQL-க்கு

நினைவகப் பற்றாக்குறை கொலையாளியை அமைத்தல் Linux PostgreSQL-க்கு

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

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

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

முக்கிய பணிகளில் ஒன்று Linux செயல்முறைகள் கோரும்போது அவற்றுக்கு நினைவகத்தை ஒதுக்குங்கள். பொதுவாக, ஒரு செயல்முறை அல்லது பயன்பாடு இயக்க முறைமையிடம் (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-கில்லரை எவ்வாறு கட்டுப்படுத்துவது

В Linux நீங்கள் OOM-Killer-ஐ இயக்கலாம் அல்லது முடக்கலாம் (இருப்பினும், முடக்குவது பரிந்துரைக்கப்படவில்லை). அதை இயக்க அல்லது முடக்க, இந்த அளவுருவைப் பயன்படுத்தவும். 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-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-கில்லரைப் பயன்படுத்துவதைத் தவிர்க்க, அமைக்கவும் vm.overcommit_memory மதிப்பு 2. OOM-கில்லர் தலையிட வேண்டியதில்லை என்பதற்கு இது உத்தரவாதம் அளிக்காது, ஆனால் இது PostgreSQL செயல்முறையை கட்டாயப்படுத்தி நிறுத்துவதற்கான வாய்ப்பைக் குறைக்கும்.

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

DDoS பாதுகாப்பு, VPS VDS சர்வர்கள் கொண்ட தளங்களுக்கு நம்பகமான ஹோஸ்டிங் வாங்கவும் 🔥 DDoS பாதுகாப்புடன் கூடிய நம்பகமான இணையதள ஹோஸ்டிங், VPS, VDS சர்வர்களை வாங்குங்கள் | ProHoster