Score:9

ฉันจะจำกัดการใช้ CPU และ RAM สำหรับกระบวนการได้อย่างไร

ธง in

ฉันใช้ Ubuntu VPS พร้อม SFTP และคอนโซล ฉันต้องการกระบวนการเฉพาะเพื่อใช้ CPU 60% และ RAM 2048 MB เท่านั้น

ฉันต้องการให้กระบวนการอื่นใช้เพียง 30% ของ CPU และ 1024MB of RAM

ฉันจะจำกัดการใช้ CPU และ RAM ของกระบวนการได้อย่างไร

muru avatar
us flag
สิ่งนี้ตอบคำถามของคุณหรือไม่ [วิธีจำกัดการใช้ทรัพยากรสำหรับกระบวนการที่กำหนด](https://askubuntu.com/questions/1045076/how-to-limit-resource-usage-for-a-given-process)
Score:13
ธง in

ถูกเตือน: ที่นี่มีมังกร

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

ที่กล่าวว่า หากคุณเชื่อว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ มีสามทางเลือกให้คุณ: ดี, ซีพียูและกลุ่มควบคุม (Cgroups)

นี่คือ TL;DR สำหรับสามวิธีนี้:

ดีดี {กระบวนการ}

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

ขีดจำกัดซีพียูcpulimit -l 60 {กระบวนการ}

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

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

ซีจีกรุ๊ป

sudo cgcreate -g cpu:/ยับยั้ง
sudo cgset -r cpu.shares=768 ยับยั้ง
sudo cgexec -g cpu: ยับยั้ง {กระบวนการ}

Cgroups â control group â เป็นคุณลักษณะที่สร้างขึ้นในเคอร์เนล Linux ที่ช่วยให้คุณควบคุมวิธีการจัดสรรทรัพยากร ด้วย Cgroups คุณสามารถระบุจำนวน CPU, หน่วยความจำ, แบนด์วิธ หรือการรวมกันของทรัพยากรเหล่านี้ สามารถใช้โดยกระบวนการที่กำหนดให้กับกลุ่ม

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

หากคุณลงเอยด้วยช่องโหว่ของ Cgroups คุณสามารถปรับแต่งระบบให้เหมาะกับชุดของงานที่เฉพาะเจาะจงได้

mx flag
และเกี่ยวกับการจำกัดการใช้แรม คุณสามารถยกตัวอย่างการทำเช่นนั้นผ่าน CGgroups ได้หรือไม่?
Score:10
ธง cn

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

การจำกัดการใช้งาน CPU

คำตอบที่ยอดเยี่ยมนี้ สำหรับคำถามอื่นอธิบายได้ค่อนข้างดี

ติดตั้ง ซีพียู

sudo apt-get ติดตั้ง cpulimit

มีวิธีการต่างๆ ในการจำกัดการใช้งาน CPU ของกระบวนการ ฟู จะบอกว่า 20%

  • ตามชื่อกระบวนการ: sudo cpulimit -e foo -l 20.

  • ตามชื่อพาธสัมบูรณ์: sudo cpulimit -P /usr/bin/foo -l 20

  • โดย PID:

  1. ค้นหา PID ของกระบวนการ: ปิด foo. (พูดได้ว่าผลลัพธ์คือ 1881)
  2. sudo cpulimit -p 1881 -l 20

การจำกัดการใช้หน่วยความจำ

สำหรับตัวเลือกเพิ่มเติม โปรดดูที่ โพสต์นี้ เกี่ยวกับวิธีจำกัดการใช้ RAM

ตัวอย่างเช่น หากต้องการจำกัดกระบวนการ 12345 ถึง 2048 MB ของการใช้ RAM คุณสามารถใช้ ขีด จำกัด สั่งการ

$ prlimit --pid 12345 --as=2048000000
mx flag
โปรดทราบว่า `การจำกัดพื้นที่ที่อยู่' นั้น **ไม่เหมือนกัน** กับ `การจำกัดการใช้ RAM' การเรียกมันว่า `limit virtual memory (RAM+swap)` นั้นดีกว่า _little_ แต่ก็ยังไม่ถูกต้องเราสามารถมีโปรแกรมที่ต้องการพื้นที่ว่าง 3GB หรือที่อยู่ ในขณะที่ใช้ RAM เพียง 100MB และการแลกเปลี่ยน 0 MB ตัวอย่างเช่น (ดู `mmap(2)` & friends อาร์เรย์ที่กระจัดกระจาย เป็นต้น)
cocomac avatar
cn flag
@MatijaNalis หากคุณรู้วิธีที่ดีกว่า ให้โพสต์คำตอบ หรือแก้ไขหนึ่งในคำตอบที่มีอยู่
Peter Cordes avatar
fr flag
@MatijaNalis: ulimit ดั้งเดิม `-m ` (ใน KiB) ทำงาน? มันควรจะจำกัดขนาดชุดถิ่นที่อยู่ตาม `ulimit --help` (มี ulimit `-v virtual memory` แยกต่างหาก (ใน KiB)) สำหรับเวลา CPU ยังมี `ulimit -t แบบดั้งเดิม ` การตั้งค่า ซึ่งฉันคิดว่าเพียงแค่ให้เคอร์เนลฆ่ากระบวนการที่เกินกว่านั้น
mx flag
@PeterCordes โชคไม่ดีที่ฉันไม่คิดอย่างนั้น (แม้ว่า ResidentSetSize จะเป็นสิ่งที่ @newalvaro9 ต้องการจำกัด) - ไม่ได้อยู่ในเมล็ดที่ไม่ใช่ของเก่า แต่อย่างใด `strace bash` เปิดเผยว่า `ulimit -m` เรียก `prlimit64(0, RLIMIT_RSS, ...` และ man page `prlimit64(2)` พูด (เหนือสิ่งอื่นใด) ว่า `RLIMIT_RSS [....] limit มีผล เฉพาะใน Linux 2.4.x, x
Peter Cordes avatar
fr flag
@MatijaNalis: นั่นสมเหตุสมผลแล้ว เมื่อหน่วยความจำโอเวอร์คอมมิตถูกเปิดใช้งานโดยค่าเริ่มต้น การทำให้มีประโยชน์นั้นทำได้ยาก การจัดสรรหน้าจริงเกิดขึ้นช้าเกินไปสำหรับ mmap / malloc ที่จะคืนค่า NULL ดังนั้นตัวเลือกเดียวที่จะสลับหน้าอื่น ๆ เพื่อให้มีที่ว่าง (สร้าง swap thrashing เมื่อกระบวนการหนึ่งออกจาก RSS) หรือฆ่าทิ้ง ซึ่งไม่เป็นที่ต้องการอย่างยิ่ง . และสันนิษฐานว่าการทำบัญชีจะดูดประสิทธิภาพในระบบมัลติคอร์สำหรับกระบวนการแบบมัลติเธรด แต่มันก็สมเหตุสมผลเช่นกันที่ตัวเลือกเชลล์ `ulimit -m` ไม่สามารถหายไปได้ และฟิลด์ API / ABI ไม่สามารถหายไปได้
Peter Cordes avatar
fr flag
มันอาจจะสมเหตุสมผลสำหรับ Linux build ของ `bash` เพื่อพิมพ์ `(ไม่มีผลใน Linux หลังจาก 2.4.30)` ซึ่งเป็นส่วนหนึ่งของเอาต์พุตความช่วยเหลือ ดังนั้นคนอื่นๆ จึงไม่เสียเวลากับมัน ถ้าโดยพื้นฐานแล้วมันไม่มี โอกาสที่ลีนุกซ์เวอร์ชั่นในอนาคตจะทำให้มันทำอะไรได้อีก

โพสต์คำตอบ

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