จำกัด กระบวนการไม่ให้เกินกว่า 10% ของการใช้งาน CPU


32

ฉันใช้งานระบบ Linux ซึ่งมีผู้ใช้จำนวนมาก แต่บางครั้งก็มีการละเมิดเกิดขึ้น ที่ผู้ใช้อาจเรียกใช้กระบวนการเดียวที่ใช้ CPU / หน่วยความจำมากกว่า 80%

ดังนั้นมีวิธีที่จะป้องกันไม่ให้เกิดขึ้นโดย จำกัด ปริมาณการใช้ CPU ที่กระบวนการสามารถใช้ (ตัวอย่างเช่น 10%)? ฉันรู้cpulimitแต่มันใช้ขีด จำกัด กับกระบวนการที่ฉันสั่งให้ จำกัด (เช่นกระบวนการเดียว) ดังนั้นคำถามของฉันคือฉันจะใช้ข้อ จำกัด กับกระบวนการทำงานและกระบวนการทั้งหมดที่จะทำงานในอนาคตได้อย่างไรโดยไม่ต้องระบุ id / path ตัวอย่างเช่น


คุณประสบปัญหาประสิทธิภาพหรือไม่? หรือเป็นเพียงตัวเลขที่รบกวนคุณ
ctrl-alt-delor

@richard ปัญหาประสิทธิภาพดังนั้นฉันจึงพยายามฆ่า / จำกัด / ยุติกระบวนการที่ดูเหมือนจะใช้ CPU จำนวนมาก แต่ฉันก็ทำเช่นนั้นด้วยการเขียนสคริปต์ทุบตี นี่เป็นเครื่องเสมือนถ้าช่วยได้
Giovanni Mounir

2
ระวังกระบวนการฆ่าที่อาจเป็น 100% ในเวลาอันสั้นรวมถึงกระบวนการของระบบ พิจารณาcpulimitร่วมกับสคริปต์ค้นหาของคุณ มีนโยบายและแนะนำการใช้งานจากcpulimitนั้นค้นหามากกว่า 10% แล้ว จำกัด ไว้ที่ 5% (เพื่อให้ผู้ใช้ได้รับการสนับสนุนให้ใช้cpulimit) ตรวจสอบให้แน่ใจว่าคุณสามารถตรวจจับกระบวนการต่างๆที่เพิ่มขึ้นมากถึง 10% สำหรับผู้ใช้รายเดียว
ctrl-alt-delor

@ Richard ขอบคุณ Richard สำหรับความคิดเห็นที่มีประโยชน์ทั้งหมดเหล่านี้! พวกเขาช่วยฉันอย่างมาก! คำแนะนำในการใช้งานของคุณcpulimitนั้นดีกว่าการฆ่ากระบวนการเนื่องจากผู้ใช้สามารถเริ่มต้นใหม่ได้ในภายหลัง (ดังที่ได้กล่าวไว้ในความคิดเห็นของคุณ) ขอขอบคุณ!
Giovanni Mounir

คำตอบ:


20

แม้ว่ามันจะเป็นการละเมิดหน่วยความจำ แต่ก็ไม่ได้มีไว้สำหรับ CPU: เมื่อ CPU ไม่ได้ใช้งานกระบวนการทำงาน (โดย "กำลังทำงาน" ฉันหมายความว่ากระบวนการไม่รอ I / O หรืออย่างอื่น) จะใช้เวลา เวลา CPU 100% โดยค่าเริ่มต้น และไม่มีเหตุผลที่จะบังคับใช้ขีด จำกัด

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

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

อีกวิธีคือการตั้งค่า/etc/security/limits.confขีด จำกัด ; ดูหน้า จำกัด limit.conf (5) ตัวอย่างเช่นคุณสามารถตั้งเวลา CPU สูงสุดต่อการเข้าสู่ระบบและ / หรือจำนวนกระบวนการสูงสุดต่อการเข้าสู่ระบบ คุณยังสามารถตั้งค่าmaxloginsเป็น 1 สำหรับผู้ใช้แต่ละคน


1
@GiovanniMounir ฉันหมายถึง: เครื่องเสมือนหนึ่งเครื่องต่อผู้ใช้หนึ่งราย
vinc17

1
ฉันเห็น แต่น่าเสียดายว่านี่จะเป็นการสิ้นเปลืองทรัพยากรและไม่มีประโยชน์จริง ๆ สำหรับวัตถุประสงค์ของฉันเนื่องจากผู้ใช้อาจต้องใช้แพ็คเกจการพัฒนาทั่วไปบางอย่างและฉันจะไม่ติดตั้งสิ่งนี้ในเครื่องใหม่ทุกเครื่อง ฉันคิดว่าเป็นการดีกว่าที่จะปล่อยให้เป็นเช่นนั้นและทำการตรวจสอบอัตโนมัติโดยสคริปต์ทุบตี
Giovanni Mounir

1
@GiovanniMounir คุณสามารถแชร์พาร์ติชั่นระหว่างเครื่องเสมือนหลายเครื่อง
vinc17

@GiovanniMounir คุณสามารถใช้LXCหรือDockerเพื่อลดค่าใช้จ่ายในการจำลองเสมือนให้เกือบเป็นศูนย์ อีกทั้ง "ความชอบ" ก็ไม่ใช่เหตุผลที่ดี ตัวอย่างเช่นฉันจะไปพร้อมกับโซลูชันของคุณหากคุณกำลังจัดการโฮสต์ PHP ที่ใช้ร่วมกันเนื่องจากการทำ LXCs หรือ Virtual Machines จะต้องมีการเขียนซอฟต์แวร์ลิขสิทธิ์ที่ราคา $ 15 / $ 5 ซึ่งเกินขีด จำกัด
Pooyan Khosravi

ความเข้าใจของฉันคือการที่ดีเท่านั้นที่ตั้ง CPU ญาติเมื่อเทียบกับกระบวนการอื่น ๆ หากไม่มีกระบวนการอื่นกำลังใช้งาน CPU กระบวนการของคุณจะใช้ CPU 100% ไม่ จำกัด เพียง 10%
johny ทำไม

25

ดี / renice

nice เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการปรับแต่ง 'one off' ไปยังระบบ

 nice COMMAND

cpulimit

cpulimit ถ้าคุณต้องการใช้งาน CPU มากและการมีเวลา CPU ฟรีเป็นสิ่งจำเป็นสำหรับการตอบสนองของระบบ

cpulimit -l 50 COMMAND

cgroups

cgroups ใช้ข้อ จำกัด กับชุดของกระบวนการแทนที่จะเป็นเพียงหนึ่งกระบวนการ

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

ทรัพยากร

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
สำหรับผู้ที่ต้องการตั้งค่าขีด จำกัด ฮาร์ดในการใช้งาน CPU แม้ในขณะที่ไม่มีกระบวนการอื่นทำงานให้ดูที่cpu.cfs_quota_usพารามิเตอร์ (ดูคู่มือ )
Diego

กลุ่ม cg ใช้งานง่ายขึ้นด้วยคำสั่ง systemd ... สร้างหน่วยระบบหรือผู้ใช้เพื่อจุดประสงค์นั้นเป็นตัวเลือกที่ดีที่สุด
Yves Martin

สำหรับกระบวนการที่กำลังดำเนินอยู่เช่น:sudo cgclassify -g cpu:cpulimited 2315444
พลังกุมภ์

1
ความเข้าใจของฉันคือการที่ดีเท่านั้นที่ตั้ง CPU ญาติเมื่อเทียบกับกระบวนการอื่น ๆ หากไม่มีกระบวนการอื่นกำลังใช้งาน CPU กระบวนการของคุณจะใช้ CPU 100% ไม่ จำกัด เพียง 10%
johny ทำไม

10

คุณดูกลุ่ม cg หรือไม่ มีข้อมูลบางอย่างเกี่ยวกับArch Wikiเกี่ยวกับพวกเขา อ่านหัวข้อเกี่ยวกับcpu.sharesดูเหมือนว่ากำลังทำสิ่งที่คุณต้องการและพวกเขาสามารถทำงานในระดับผู้ใช้เพื่อให้คุณสามารถ จำกัด กระบวนการผู้ใช้ทั้งหมดในครั้งเดียว


กลุ่ม CG เป็นวิธีที่จะไปแม้ว่า ฉันยังเรียกใช้เซิร์ฟเวอร์คอมพิวเตอร์ที่แชร์ (จำนวนมาก) และเราใช้ cgroups เพื่อ จำกัด จำนวนคอร์สูงสุดที่เซสชั่นการเข้าสู่ระบบทั้งหมดสามารถใช้ได้ ด้วยวิธีนี้ถ้าบุคคลนั้นเริ่มต้นกระบวนการใหม่ ๆ แต่ละคนก็จะได้ชิ้นเล็กลง เช่นเดียวกับการใช้หน่วยความจำ คุณสามารถให้ผู้ใช้ใส่ใน cgroup ได้โดยอัตโนมัติด้วย pam_cgroups และบริการ cgrulesengd คุณสามารถใช้ 'เทมเพลต' ในไฟล์ cgconfig เพื่อใส่ผู้ใช้แต่ละคนลงใน cgroup ของตนเอง cgrulesengd ทำหน้าที่เหมือนสคริปต์ของคุณยกเว้นแทนที่จะฆ่ากระบวนการมันแค่ทำให้แน่ใจว่าแต่ละกระบวนการอยู่ใน cgroup ที่ถูกต้อง
jsbillings

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

3

สำหรับหน่วยความจำ, ulimit -vสิ่งที่คุณกำลังมองหาอยู่ โปรดทราบว่าulimitได้รับการสืบทอดโดยกระบวนการลูกดังนั้นหากคุณใช้กับเปลือกเข้าสู่ระบบของผู้ใช้ในเวลาที่เข้าสู่ระบบนั้นจะใช้กับกระบวนการทั้งหมดของเขา

หากผู้ใช้ของคุณทั้งหมดใช้bashเป็นล็อกอินเชลล์การวางบรรทัดต่อไปนี้/etc/profileควรทำให้กระบวนการผู้ใช้ทั้งหมดมีขีด จำกัด สูงสุด 1 กิกะไบต์ (มากกว่าหนึ่งล้านกิโลไบต์)

ulimit -vH 1000000

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

สำหรับเชลล์อื่นคุณจะต้องค้นหาไฟล์เริ่มต้นที่พวกเขาอ่านแทน (และคำสั่งอื่น ๆ ที่ใช้แทนulimit)

สำหรับ CPU สิ่งที่คุณต้องการดูเหมือนจะไม่สมเหตุสมผลสำหรับฉัน อะไรคือการใช้ 90% ของ CPU ที่ไม่ได้ใช้เมื่อมีเพียงกระบวนการเดียวที่กำลังทำงานอยู่ ฉันคิดว่าสิ่งที่คุณต้องการคือnice(และอาจionice) โปรดทราบว่าเหมือนulimit, niceค่าที่สืบเชื้อสายมาจากกระบวนการที่เด็กเพื่อนำไปใช้กับเปลือกเข้าสู่ระบบที่พอเพียงครั้งที่เข้าสู่ระบบ ฉันเดาว่ามันใช้ได้กับioniceแต่ฉันไม่แน่ใจ


ขอบคุณสำหรับคำแนะนำหน่วยความจำ! มีโอกาสใดบ้างที่คุณสามารถแสดงตัวอย่างให้ฉันใช้กับเชลล์ล็อกอินของผู้ใช้ในเวลาล็อกอิน? ฉันไม่แน่ใจจริงๆว่าจะทำอย่างไร ฉันขอโทษที่ยังไม่ชัดเจนพอ สิ่งที่ฉันพยายามทำไม่อนุญาตให้กระบวนการใด ๆ ใช้ CPU มากกว่า 10% คุณคิดว่าniceจะดีพอที่จะทำเช่นนี้? ถ้าเป็นเช่นนั้นคุณคิดว่าคุณสามารถแสดงตัวอย่างให้ฉันดูได้หรือไม่?
Giovanni Mounir

ฉันยังคงไม่ได้รับจุดที่ใช้งาน CPU 90% ขณะที่ทำงานเพียงกระบวนการเดียว
celtschk

1
หากปัจจุบันมีกระบวนการน้อยกว่า 10 กระบวนการที่ทำงานพร้อมกัน (และโดยการรันฉันหมายถึงการทำงานจริง ๆไม่ใช่แค่รออินพุตของผู้ใช้หรือดิสก์ I / O) ก็รับประกันได้เลยว่าหนึ่งในนั้นจะมี CPU มากกว่า 10% ไม่เช่นนั้น CPU ก็จะไม่ทำงาน และถ้าคุณเพียงแค่ฆ่ากระบวนการใด ๆ ที่สูงกว่า 10% ฉันมั่นใจว่าคุณจะมีผู้ใช้จำนวนมากที่ต้องการจะฆ่าคุณ หรืออย่างน้อยก็ลองให้คุณแทนที่ด้วยคนที่มีเบาะแสเกี่ยวกับความหมายของตัวเลขเหล่านั้นเพราะคุณดูเหมือนจะไม่
celtschk

ตรงกันข้ามกับความคิดเห็นของ @celtschk หากมี 11 กระบวนการหรือมากกว่านั้นทำงาน (ผูกซีพียู) พวกเขาจะน้อยกว่า 9.09% ดังนั้นถ้าฉันเป็นผู้ใช้ของระบบที่ห้ามการใช้งานซีพียูมากกว่า 10% ฉันสามารถเรียกใช้กระบวนการ 11 กระบวนการขึ้นไปและซ่อนอยู่ภายใต้เรดาร์
ctrl-alt-delor

@ Richard คุณพูดถูกบางทีอาจจะดีกว่าถ้าสคริปต์จะสรุปยอดรวมจำนวนหน่วยความจำ / CPU ที่ใช้โดยผู้ใช้และจากนั้นจะยุติกระบวนการทั้งหมดของผู้ใช้นี้เมื่อเปอร์เซ็นต์ถึงจำนวนเฉพาะ ออก)
Giovanni Mounir

3

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


1
niceและrenice? เยี่ยมมาก! ฉันได้ดูหน้าคู่มือของพวกเขาแล้ว แต่ฉันก็ยังไม่คิดว่าพวกเขาจะช่วยได้เพราะคุณยังต้องตั้งรหัสกระบวนการ หากคุณสามารถให้ฉันตัวอย่างที่เกี่ยวข้องกับแพคเกจเหล่านี้เพื่อใช้ขีด จำกัด ในกระบวนการทำงานทั้งหมด / กระบวนการในอนาคตที่จะยอดเยี่ยม!
Giovanni Mounir

1

ตั้งแต่แท็กของคุณมีคุณสามารถใช้centossystemd

ตัวอย่างเช่นหากคุณต้องการ จำกัด ผู้ใช้ด้วย ID ของ1234:

sudo systemctl edit --force user-1234.slice

จากนั้นพิมพ์และบันทึกสิ่งนี้:

[Slice] CPUQuota=10%

ครั้งต่อไปที่ผู้ใช้ล็อกอินจะมีผลกระทบ

หน้าคน: systemctl, systemd.slice, systemd.resource-control...


0

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

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

ในกรณีของการเปิดตัวโลภpypdfocrtesseract

ในบางกรณี CPU ของคุณค่อนข้างดีคุณสามารถใช้สิ่งreniceนี้:

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