ปิดใช้งาน OOM killer บน Ubuntu 14.04


2

จะปิดการใช้งานOOM killerบน Ubuntu 14.04 อย่างไร มีคำอธิบายอยู่ที่นี่แต่ดูเหมือนจะไม่ได้ทำงานให้กับ OP คงจะดีถ้าได้รับคำตอบพร้อมขั้นตอนที่ชัดเจน

คำตอบ:


10

นี่เป็นปัญหา XY นั่นคือคุณมีปัญหา (X) ไม่ว่าคุณจะรู้หรือไม่และเชื่อว่าคุณสามารถแก้ปัญหาโดยการแก้ปัญหาที่แตกต่างซึ่งก็คือปัญหา Y

ทำไมคุณถึงต้องการปิดการใช้งาน oomkiller นั่นคือปัญหา X ที่คุณต้องแก้ไข สิ่งที่คุณควรทำคือตรวจสอบและแก้ไขปัญหารายละเอียด X ระบุรายละเอียดและเป็นไปได้ที่เราสามารถช่วยคุณได้

การตามหลังปัญหา Y และการปิดใช้งาน oomkiller โดยทั่วไปเป็นความคิดที่เลวมากซึ่งแน่นอนว่าจะสร้างปัญหาที่ใหญ่กว่าซึ่งมันอาจแก้ไขได้

การเรียกใช้ oomkiller นั้นเป็นทางเลือกสุดท้ายเมื่อทุกสิ่งมีความจำที่ผิดเพี้ยนและการลงโทษก็ใกล้เข้ามาแล้ว ระบบของคุณมีผู้โดยสารหกคนใช้เวลาเดินทางหนึ่งชั่วโมงและมีออกซิเจนเพียงห้าชั่วโมง คุณอาจคิดว่าการฆ่าผู้โดยสารหนึ่งคนโดยการสุ่ม (ไม่ใช่แบบสุ่ม - คนที่มีการเผาผลาญสูงกว่าจริง ๆ ) เป็นสิ่งที่น่ากลัวอย่างยิ่ง

สมมติว่าคุณทำอย่างนั้น

คุณประสบความสำเร็จในการปิดการใช้งาน oomkiller ระบบรีสตาร์ทและไปในทางที่ร่าเริง ตอนนี้มีสองสิ่งที่สามารถเกิดขึ้นได้:

  • oomkiller ไม่ต้องภาวนา คุณทำทุกอย่างเพื่อสิ่งใด
  • oomkiller ไม่จำเป็นต้องเรียกใช้

แต่ทำไมต้องใช้ oomkiller นั่นเป็นเพราะกระบวนการบางอย่างต้องการหน่วยความจำและระบบค้นพบว่าไม่สามารถให้บริการหน่วยความจำนั้นได้

มีกระบวนการที่เราเรียกว่า "memoryhog" ซึ่งจะถูกฆ่าโดย oomkiller และตอนนี้นี่ไม่ใช่สิ่งที่เกิดขึ้น สิ่งที่ไม่เกิดขึ้น?

ตัวเลือกที่ 1: OOM หมายถึงความตาย

คุณออกคำสั่งเหล่านี้ตอนบูต

sysctl vm.panic_on_oom=1
sysctl kernel.panic=5

หรือเพิ่มสิ่งนี้ใน/etc/sysctl.confและรีบูต

vm.panic_on_oom=1
kernel.panic=5

และทันทีที่ระบบถูก hogged มันจะตกใจและรีบูตหลังจาก 5 วินาที

ตัวเลือกที่ 2: ฆ่าคนอื่นถ้าเป็นไปได้

คุณจัดประเภทเมื่อเริ่มกระบวนการบางอย่างเป็น "พอ" และอื่น ๆ เป็น "ไม่พอ" ยกตัวอย่างเช่น Apache อาจจะมีค่าใช้จ่ายไม่ใช่ MySQL ดังนั้นเมื่อ Apache พบคำขอขนาดใหญ่ที่ไร้เหตุผล (ในระบบ LAMP โดยปกติจะเกิดจาก "การแก้ไขง่าย" ของการตั้งค่าการจัดสรรหน่วยความจำ PHP เป็นค่าขนาดใหญ่อย่างน่าหัวเราะแทนการเปลี่ยนวิธีการจำขอบเขตหรือรั่วไหล) เด็ก Apache จะถูกฆ่าแม้ว่า MySQL เป็นหมูขนาดใหญ่ ด้วยวิธีนี้ลูกค้าจะเห็นหน้าว่างเปล่ากด RELOAD รับอีก ... และในที่สุดก็หยุดยั้ง

คุณทำได้โดยบันทึก PID ของ MySQL เมื่อเริ่มต้นและปรับระดับ OOM:

echo -15 > /proc/$( pidof mysql )/oom_adj

ในสถานการณ์นี้ แต่ฉันจะปรับความเชื่อมั่นของลูกอาปาเช่ด้วย

โปรดทราบว่าหากตัวเลือกนี้แก้ปัญหาของคุณได้หมายความว่าคุณมีปัญหาในกระบวนการอื่น ๆ (ตัวอย่างเช่นกระบวนการ PHP ที่มีขนาดใหญ่เกินไปซึ่งมาจากอัลกอริทึมย่อยที่เหมาะสมที่สุดหรือขั้นตอนการเลือกข้อมูลคุณทำตามลูกโซ่จนกว่าคุณจะมาถึง ที่ปัญหาหนึ่งซึ่งจริงๆเป็นหนึ่งในการแก้ปัญหา)

อาจเป็นไปได้ว่าการติดตั้ง RAM เพิ่มเติมจะมีผลเช่นเดียวกัน

ในตัวเลือกนี้ถ้า MySQL ตัวเองเติบโตมากเกินไป (เช่นคุณเรียบร้อยค่า innodb_pool_size) จากนั้น MySQL จะถูกฆ่าตายอยู่แล้ว

ตัวเลือก 3: ไม่เคยฆ่ากระบวนการ $ MYPRECIOUSSS

ข้างต้น แต่ตอนนี้การปรับตั้งเป็น -17

ตอนนี้ฉันกำลังพูดถึง MySQL แต่โปรแกรมส่วนใหญ่จะทำงานในลักษณะเดียวกัน ฉันรู้ว่าทั้ง PostgreSQL และ Oracle ทำ (และพวกเขามีสิทธิ์คุณใช้ RDBMS ในทางที่ผิด)

ตัวเลือกนี้จะเป็นอันตรายใน oomkiller ที่จะฆ่าคนอื่นอาจจะซ้ำ ๆแต่เหนือสิ่งอื่นใดอาจจะเป็นเพราะ $ MYPRECIOUSSS ตัวเอง

ดังนั้นกระบวนการที่ควบคุมไม่ได้จะขับไล่คนอื่นจากหน่วยความจำจนกระทั่งระบบไม่สามารถใช้งานได้และคุณไม่สามารถแม้แต่จะลงชื่อเข้าใช้เพื่อตรวจสอบหรือทำอะไรก็ได้ หลังจากนั้นไม่นาน MySQL จะทำลายข้อมูลสถานะของตัวเองและเกิดความผิดพลาดอย่างน่ากลัวและคุณจะถูกทิ้งให้อยู่กับfsckเซสชันที่ยาวนานและตามด้วยการซ่อมแซมตารางอย่างระมัดระวังแล้วตามด้วยการสร้างธุรกรรมอย่างระมัดระวัง

ฉันสามารถบอกคุณได้จากประสบการณ์ของฉันเองที่ฝ่ายบริหารจะไม่พึงพอใจอย่างยิ่งกับผู้ที่ตั้งค่าการวางระเบิดครั้งที่ส่งผล จะมีความผิดเกิดขึ้นมากมาย (MySQL ผิดพลาด, Apache ถูกรั่ว, OOMKiller เป็นบ้า, มันเป็นแฮ็กเกอร์ ... ) ดังนั้น "หนึ่ง" อาจเป็น "หลายคน" อย่างไรก็ตามสำหรับตัวเลือกที่สามนี้ฉันไม่สามารถเครียดได้มากพอที่ความต้องการการสำรองข้อมูลที่ครบถ้วนเพียงพอและได้รับการปรับปรุงและตรวจสอบอย่างต่อเนื่องพร้อมกับการทดสอบการกู้คืน

ตัวเลือก 4 - "ปิด" OOMkiller

ตัวเลือกนี้อาจมีลักษณะเหมือนเป็นเรื่องตลก เช่นเดียวกับเคล็ดลับ Windows XP เก่าสู่ "วิธีหลีกเลี่ยงหน้าจอสีน้ำเงินตลอดไป!" - ที่จริงทำงานจริงๆ ... โดยการตั้งค่าตัวแปรที่รู้จักกันน้อยที่หันสีม่วงแดง

แต่คุณสามารถทำให้ oomkiller ไม่เคยถูกเรียกใช้โดยแก้ไข/etc/sysctl.confไฟล์และเพิ่มบรรทัดเหล่านี้:

vm.overcommit_memory = 2
vm.overcommit_kbytes = 0

จากนั้นเรียกใช้คำสั่งsysctl vm.overcommit_memory=2และsysctl vm.overcommit_kbytes=0เพื่อหลีกเลี่ยงความต้องการในการรีบูต

เกิดอะไรขึ้น? หากระบบมีหน่วยความจำเพียงพอไม่มีอะไรเกิดขึ้น - เหมือนกับคุณไม่ได้ทำอะไรเลย

เมื่อระบบมีหน่วยความจำเหลือน้อยกระบวนการใหม่จะไม่สามารถเริ่มต้นหรือหยุดทำงานเมื่อเริ่มต้น พวกเขาต้องการหน่วยความจำและหน่วยความจำไม่ได้อยู่ที่นั่น ดังนั้นพวกเขาจะไม่ถูก "oomkilled" แต่แทนที่จะ "ถูกฆ่าโดยข้อผิดพลาดหน่วยความจำไม่เพียงพอ" ผลลัพธ์เหมือนกันอย่างแน่นอนและนั่นเป็นเหตุผลว่าทำไมบางคนคิดว่าเรื่องนี้เป็นเรื่องตลก

คำแนะนำของฉันเอง

ตรวจสอบสาเหตุที่ระบบมีหน่วยความจำเหลือน้อย สิ่งนี้สามารถหลีกเลี่ยงไม่ได้โดยอัตโนมัติแก้ไขได้หรือหลีกเลี่ยงได้โดยสิ้นเชิง หากหลีกเลี่ยงไม่ได้โดยเนื้อแท้ให้ชนปัญหาให้สูงขึ้นและต้องติดตั้งหน่วยความจำเพิ่มเติม

หากมีสาเหตุมาจากกระบวนการของการหลบหนีเนื่องจากข้อผิดพลาดหรือการป้อนข้อมูลผิดพลาดหรือเงื่อนไขที่สามารถรับรู้ได้ก่อนที่วิกฤตจะแก้ไขได้ คุณต้องมีการปรับโครงสร้างกระบวนการและสร้างเคสสำหรับสิ่งนั้น

นอกจากนี้ยังอาจเกิดขึ้นได้ว่าปัญหาสามารถหลีกเลี่ยงได้โดยการแยกการบริการระหว่างเซิร์ฟเวอร์ที่แตกต่างกันหรือโดยการปรับกระบวนการอย่างน้อยหนึ่งกระบวนการหรือโดยการปรับโครงสร้างกระบวนการที่ผิดพลาดอีกครั้ง

ในบางสถานการณ์โซลูชันที่มีประสิทธิภาพมากขึ้นอาจเป็น "ทิ้งเงินไปเลย" - หากคุณมีปัญหากับเซิร์ฟเวอร์ที่มี RAM 256GB และคุณรู้ว่าคุณจะต้องมีค่าสูงสุด 280 สำหรับอนาคตอันใกล้การอัพเกรดเป็น 320GB อาจมีค่าใช้จ่าย น้อยกว่า 3,000 USD ล่วงหน้ารวมทุกอย่างแล้วเสร็จในวันหยุดสุดสัปดาห์ซึ่งเมื่อเทียบกับต้นทุนการหยุดทำงาน 150,000 USD / วันหรือการเขียนโปรแกรม 4 รายการต่อเดือน 14,000 USD เป็นข้อตกลงที่ดีและน่าจะเป็นไปได้ ปรับปรุงการแสดงแม้ในสภาพชีวิตประจำวัน

อีกทางเลือกหนึ่งคือการตั้งค่าพื้นที่แลกเปลี่ยนที่มีขนาดใหญ่มากและเปิดใช้งานได้ตามต้องการ สมมติว่าเรามี 32 GB ฟรี/var/tmp(และไม่ได้สำรองข้อมูลไว้ในหน่วยความจำ):

dd if=/dev/zero of=/var/tmp/oomswap bs=1M count=32768
# or: fallocate -l 32g /var/tmp/oomswap
chmod 600 /var/tmp/oomswap
mkswap /var/tmp/oomswap
swapon /var/tmp/oomswap

สิ่งนี้จะสร้างไฟล์ขนาด 32Gb ที่มีประโยชน์เพื่อให้กระบวนการหายใจต่างๆ คุณอาจต้องการตรวจสอบและเพิ่มความรวดเร็ว:

cat /proc/sys/vm/swappiness

Ubuntu 14.04 มีความรวดเร็วในการตั้งค่าเริ่มต้น 60 ซึ่งก็โอเคสำหรับผู้ใช้ส่วนใหญ่

sysctl vm.swappiness=70

ฉันได้รับคะแนนทั้งหมดของคุณ (และขอขอบคุณสำหรับการตอบสนองอย่างละเอียด) แต่ดูจาก5:28เป็นต้นไป: youtube.com/watch?v=3yhfW1BDOSQดังนั้นอย่างน้อยมันก็ดีที่จะมีโครงร่างของขั้นตอนที่จำเป็นในการเลี้ยว OOM killer ปิด ขอบคุณสำหรับสิ่งนั้น
Hassan Baig

คุณสามารถป้องกัน OOMkiller ไม่ให้ทำงาน (ส่วนใหญ่) โดยทำตามคำแนะนำของ @aecolley ด้วยวิธีนี้การจัดสรรหน่วยความจำมากเกินไปเป็นไปไม่ได้ โปรแกรมใด ๆ พยายามที่มันจะเป็น oomki ... ยกเลิก ขั้นตอนในการทำเช่นนั้นดีขึ้นเล็กน้อยแล้วในคำตอบของฉัน
LSerni

1

echo 2 > /proc/sys/vm/overcommit_memory echo 0 > /proc/sys/vm/overcommit_kbytes ดูhttps://www.kernel.org/doc/Documentation/sysctl/vm.txtสำหรับคำอธิบายของตัวเลือก

ข้อแม้มาตรฐานใช้: เมื่อระบบมีหน่วยความจำไม่เพียงพอและโปรแกรมของคุณขอข้อมูลเพิ่มเติมจะถูกปฏิเสธ และนี่คือจุดที่หลาย ๆ โปรแกรมขัดข้องหรือมีลิ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.