วิธีการตั้งค่าการปรับ OOM killer สำหรับ daemons อย่างถาวร


12

ใช้เซิร์ฟเวอร์ Linux บางตัวที่มี daemons บริการระบบเพียงครั้งเดียวหรือเพียงไม่กี่ตัวฉันต้องการปรับ OOM killer สำหรับกระบวนการ daemonized เหล่านั้นในกรณีที่มีสิ่งผิดปกติเกิดขึ้น ตัวอย่างเช่นวันนี้เซิร์ฟเวอร์ Ubuntu บางตัวที่ใช้งาน MySQL ได้ถูกทำลายไปแล้วเพราะมีapt-checkerกระบวนการมากมายที่ต้องใช้หน่วยความจำทั้งหมดและเคอร์เนลคิดว่าเป็นความคิดที่ดีที่จะฆ่า MySQL

ฉันรู้ว่าฉันสามารถปรับคะแนนโดยใช้/proc/$(pidof mysqld)/oom_score_adjไฟล์เพื่อให้เคอร์เนลเบาะแสบางอย่างที่ฉันไม่ต้องการให้ MySQL ถูกฆ่า แต่นั่นก็ไม่รอดการรีสตาร์ทบริการ ฉันควรแก้ไขสคริปต์ init / upstart จากแพ็คเกจเพื่อรวมการปรับเปลี่ยนเหล่านี้หรือไม่ ฉันไม่คิดว่ามันเป็นทางออกที่หรูหรามากเพราะฉันจะทำการปรับเปลี่ยนไฟล์ที่เป็นของแพ็คเกจ เป็นไปได้ไหมที่จะขอใช้งานสคริปต์เริ่มต้น / เริ่มต้นโดยทั่วไปและปรับตามเงื่อนไข หรือคุณอยากแนะนำให้ใช้สคริปต์ที่ไม่มีกำหนดเช่นนี้while true{ adjust_oom(); sleep 60;}?


น่าสนใจว่ามีความเป็นไปได้ที่จะปรับตัว ฉันเดาว่าจะไม่มีอะไรดีไปกว่าการวนซ้ำแบบไม่มีที่สิ้นสุดของคุณเพื่อให้งานสำเร็จ OOM-killer ฝังอยู่ลึกเข้าไปในเคอร์เนลและมีอัลกอริธึมที่คลุมเครือมาก
นิลส์

คำตอบ:


8

ระบบการกำกับดูแลdæmonที่ทันสมัยหลายวิธีมีวิธีในการทำสิ่งนี้ (แน่นอนเนื่องจากมีเครื่องมือในการโหลดโซ่สำหรับงานเนื้อหาพวกเขาทั้งหมดมีวิธีในการทำเช่นนี้)

  • พุ่งพรวด:ใช้oom scoreในไฟล์งาน
    คะแนน - 500
  • systemd:ใช้การOOMScoreAdjust=ตั้งค่าในหน่วยบริการ คุณสามารถใช้ไฟล์แพตช์หน่วยบริการเพื่อส่งผลกระทบกับหน่วยบริการที่ทำแพ็กเกจไว้ล่วงหน้า
    [บริการ] 
    OOMScoreAdjust = -500
  • ครอบครัว daemontools :ใช้oom-kill-protectเครื่องมือจากชุดเครื่องมือ nosh ในrunโปรแกรมสำหรับบริการ

    หากคุณมีการแปลงเป็นหน่วยบริการของระบบที่convert-systemd-unitsเครื่องมือในความเป็นจริงจะเปลี่ยนการตั้งค่าเป็นเช่นภาวนาของOOMScoreAdjust=oom-kill-protect

    #! / bin / nosh 

    oom-kill-Protect - -500
    ... ข้อโต้แย้งของ
    โปรแกรม
    เป็นโบนัสคุณสามารถกำหนดค่าพารามิเตอร์ได้:
    oom-kill-protect - fromenv
    และตั้งค่าของพารามิเตอร์ในสภาพแวดล้อมของบริการ (สันนิษฐานว่าจะอ่านจาก envdir ที่เกี่ยวข้องกับการบริการที่นี่จัดการกับrcctlshim ของชุดเครื่องมือnosh):
    ชุด rcctl servicename oomprotect -500

อ่านเพิ่มเติม

  • Jonathan de Boyne Pollard (2016) oom-kill-protect. ชุดเครื่องมือ โปรแกรม
  • James Hunt และ Clint Byrum (2014) " oom score" พุ่งพรวดตำรา
  • Lennart Poettering (2013-10-07) " OOMScoreAdjust" systemd.exec. หน้าคู่มือ systemd freedesktop.org
  • Jonathan de Boyne Pollard rcctl. ชุดเครื่องมือ โปรแกรม
  • /unix//a/409454/5132

9

สิ่งนี้เป็นไปได้ใน Ubuntu โดยใช้ Upstart และoom scoreตัวเลือกการกำหนดค่า

oom score

ลินุกซ์มีเครื่องมืออำนวยความสะดวก "หน่วยความจำไม่เพียงพอ" [ ... ]

โดยปกติแล้วนักฆ่า OOM จะพิจารณากระบวนการทั้งหมดอย่างเท่าเทียมกันบทนี้แนะนำให้เคอร์เนลปฏิบัติต่องานนี้แตกต่างกัน

ค่า "การปรับ" ที่จัดหาให้กับบทนี้อาจเป็นค่าจำนวนเต็มตั้งแต่ -999 (ไม่น่าจะถูกสังหารโดย OOM killer) จนถึง 1,000 (น่าจะถูกสังหารโดย OOM killer) [ ... ]

ตัวอย่าง:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

สำหรับผู้อ่านที่ใช้ Ubuntu 16.04+ สิ่งนี้ล้าสมัยแล้วในตอนนี้ว่า Upstart ถูกแทนที่ด้วย systemd
gertvdijk

4

คุณสามารถแฮ็คมันลงใน MySQL ได้เอง (เช่น OpenSSH sshdทำสิ่งนี้) แต่มันก็ค่อนข้างง่ายและสกปรกมาก (มีปัญหากับการอัพเดท ฯลฯ )

คุณสามารถทำสิ่งนี้ใน wrapper หรือในสคริปต์ init - คะแนนควรได้รับการสืบทอด (และใน wrapper ที่คุณอาจต้องการทำexec mysqld "$@"ต่อไป)

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

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