จะปิดการใช้งานOOM killer
บน Ubuntu 14.04 อย่างไร มีคำอธิบายอยู่ที่นี่แต่ดูเหมือนจะไม่ได้ทำงานให้กับ OP คงจะดีถ้าได้รับคำตอบพร้อมขั้นตอนที่ชัดเจน
จะปิดการใช้งานOOM killer
บน Ubuntu 14.04 อย่างไร มีคำอธิบายอยู่ที่นี่แต่ดูเหมือนจะไม่ได้ทำงานให้กับ OP คงจะดีถ้าได้รับคำตอบพร้อมขั้นตอนที่ชัดเจน
คำตอบ:
นี่เป็นปัญหา XY นั่นคือคุณมีปัญหา (X) ไม่ว่าคุณจะรู้หรือไม่และเชื่อว่าคุณสามารถแก้ปัญหาโดยการแก้ปัญหาที่แตกต่างซึ่งก็คือปัญหา Y
ทำไมคุณถึงต้องการปิดการใช้งาน oomkiller นั่นคือปัญหา X ที่คุณต้องแก้ไข สิ่งที่คุณควรทำคือตรวจสอบและแก้ไขปัญหารายละเอียด X ระบุรายละเอียดและเป็นไปได้ที่เราสามารถช่วยคุณได้
การตามหลังปัญหา Y และการปิดใช้งาน oomkiller โดยทั่วไปเป็นความคิดที่เลวมากซึ่งแน่นอนว่าจะสร้างปัญหาที่ใหญ่กว่าซึ่งมันอาจแก้ไขได้
การเรียกใช้ oomkiller นั้นเป็นทางเลือกสุดท้ายเมื่อทุกสิ่งมีความจำที่ผิดเพี้ยนและการลงโทษก็ใกล้เข้ามาแล้ว ระบบของคุณมีผู้โดยสารหกคนใช้เวลาเดินทางหนึ่งชั่วโมงและมีออกซิเจนเพียงห้าชั่วโมง คุณอาจคิดว่าการฆ่าผู้โดยสารหนึ่งคนโดยการสุ่ม (ไม่ใช่แบบสุ่ม - คนที่มีการเผาผลาญสูงกว่าจริง ๆ ) เป็นสิ่งที่น่ากลัวอย่างยิ่ง
คุณประสบความสำเร็จในการปิดการใช้งาน oomkiller ระบบรีสตาร์ทและไปในทางที่ร่าเริง ตอนนี้มีสองสิ่งที่สามารถเกิดขึ้นได้:
แต่ทำไมต้องใช้ oomkiller นั่นเป็นเพราะกระบวนการบางอย่างต้องการหน่วยความจำและระบบค้นพบว่าไม่สามารถให้บริการหน่วยความจำนั้นได้
มีกระบวนการที่เราเรียกว่า "memoryhog" ซึ่งจะถูกฆ่าโดย oomkiller และตอนนี้นี่ไม่ใช่สิ่งที่เกิดขึ้น สิ่งที่ไม่เกิดขึ้น?
คุณออกคำสั่งเหล่านี้ตอนบูต
sysctl vm.panic_on_oom=1
sysctl kernel.panic=5
หรือเพิ่มสิ่งนี้ใน/etc/sysctl.conf
และรีบูต
vm.panic_on_oom=1
kernel.panic=5
และทันทีที่ระบบถูก hogged มันจะตกใจและรีบูตหลังจาก 5 วินาที
คุณจัดประเภทเมื่อเริ่มกระบวนการบางอย่างเป็น "พอ" และอื่น ๆ เป็น "ไม่พอ" ยกตัวอย่างเช่น 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 จะถูกฆ่าตายอยู่แล้ว
ข้างต้น แต่ตอนนี้การปรับตั้งเป็น -17
ตอนนี้ฉันกำลังพูดถึง MySQL แต่โปรแกรมส่วนใหญ่จะทำงานในลักษณะเดียวกัน ฉันรู้ว่าทั้ง PostgreSQL และ Oracle ทำ (และพวกเขามีสิทธิ์คุณใช้ RDBMS ในทางที่ผิด)
ตัวเลือกนี้จะเป็นอันตรายใน oomkiller ที่จะฆ่าคนอื่นอาจจะซ้ำ ๆแต่เหนือสิ่งอื่นใดอาจจะเป็นเพราะ $ MYPRECIOUSSS ตัวเอง
ดังนั้นกระบวนการที่ควบคุมไม่ได้จะขับไล่คนอื่นจากหน่วยความจำจนกระทั่งระบบไม่สามารถใช้งานได้และคุณไม่สามารถแม้แต่จะลงชื่อเข้าใช้เพื่อตรวจสอบหรือทำอะไรก็ได้ หลังจากนั้นไม่นาน MySQL จะทำลายข้อมูลสถานะของตัวเองและเกิดความผิดพลาดอย่างน่ากลัวและคุณจะถูกทิ้งให้อยู่กับfsck
เซสชันที่ยาวนานและตามด้วยการซ่อมแซมตารางอย่างระมัดระวังแล้วตามด้วยการสร้างธุรกรรมอย่างระมัดระวัง
ฉันสามารถบอกคุณได้จากประสบการณ์ของฉันเองที่ฝ่ายบริหารจะไม่พึงพอใจอย่างยิ่งกับผู้ที่ตั้งค่าการวางระเบิดครั้งที่ส่งผล จะมีความผิดเกิดขึ้นมากมาย (MySQL ผิดพลาด, Apache ถูกรั่ว, 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
echo 2 > /proc/sys/vm/overcommit_memory
echo 0 > /proc/sys/vm/overcommit_kbytes
ดูhttps://www.kernel.org/doc/Documentation/sysctl/vm.txtสำหรับคำอธิบายของตัวเลือก
ข้อแม้มาตรฐานใช้: เมื่อระบบมีหน่วยความจำไม่เพียงพอและโปรแกรมของคุณขอข้อมูลเพิ่มเติมจะถูกปฏิเสธ และนี่คือจุดที่หลาย ๆ โปรแกรมขัดข้องหรือมีลิ่ม