ช้าลงเพียงกระบวนการเดียวเพื่อควบคุมอุณหภูมิของ CPU


9
  1. ฉันมีโปรแกรม เมื่อมันทำงานอุณหภูมิของ CPU เพิ่มขึ้นจาก 50 เป็น 80 Celcius ซึ่งเป็นข้อกังวลหลักของฉัน

    ฉันสามารถควบคุมความถี่ของ CPU เพื่อทำให้ช้าลง แต่กระบวนการอื่น ๆ จะช้าลงเช่นกันซึ่งฉันไม่ต้องการ

    เป็นไปได้ไหมที่จะทำให้กระบวนการช้าลงโดยไม่ส่งผลกระทบต่อกระบวนการอื่นเพื่อให้ CPU เย็นลง?

    ระบบปฏิบัติการของฉันคือ Ubuntu 10.10

  2. ฉันพยายามกำหนดลำดับความสำคัญของกระบวนการด้วยnice -n 15 myprogramและไม่แน่ใจว่าจะทำงานได้หรือไม่ ซีพียูอยู่ที่ 77 Celcius สูง

    ไม่ได้niceตั้งค่าลำดับความสำคัญสัมพัทธ์ของกระบวนการเท่านั้นกระบวนการอื่น ๆ ? นั่นคือถ้ากระบวนการอื่นไม่ทำงานกระบวนการที่ไม่ทำงานนี้จะทำงานเร็วหรือไม่ ฉันต้องการตั้งค่าให้กระบวนการทำงานช้าลงตลอด


1
กระบวนการนี้ทำอะไร: อินพุต / เอาต์พุตหนัก การคำนวณหนักบน CPU หลักหรือไม่ การคำนวณอย่างหนักของ GPU (การ์ดแสดงผล) (ปกติ แต่ไม่ จำกัด เฉพาะโปรแกรมที่คำนวณภาพ)?
Gilles 'หยุดความชั่วร้าย'

โปรแกรมนี้เป็น pdf2djvu โดยแปลงไฟล์ pdf เป็น djvu มันหนัก IO หรือ CPU หนักหรือ GPU หนัก ๆ ? คุณมีวิธีการที่แตกต่างกันสำหรับกรณีที่แตกต่างกันอย่างไร
ทิม

4
80ºสูงมาก ฉันอาศัยอยู่ในสถานที่ร้อนของสเปนและอุณหภูมิสูงสุดของโปรเซสเซอร์ของฉันคือ ~ 60º เปิดคอมพิวเตอร์ทำความสะอาดชิ้นส่วนทั้งหมดและเปลี่ยนเครื่องทำความเย็น ฉันคิดว่าคุณไม่ใช่ซีพียูที่ใช้
Rufo El Magufo

ลองทำทั้งสองอย่าง
stribika

จริง ๆ แล้ว 80 °สูง แต่ไม่ถือว่ารุนแรงมากขึ้นอยู่กับรุ่นของ CPU ซีพียูส่วนใหญ่รองรับได้ถึง 90 ° C โดยไม่มีปัญหา
Kiwy

คำตอบ:


16

CPULimit เป็นสิ่งที่คุณต้องการ คุณเริ่มต้นโปรแกรมจากนั้นเรียกใช้ cpulimit กับชื่อโปรแกรมหรือ PID ระบุเปอร์เซ็นต์ที่คุณต้องการให้ จำกัด

คำสั่งต่อไปนี้ จำกัด กระบวนการที่การใช้งาน CPU PID 7777 ถึง 5%

cpulimit -p 7777 -l 5

หรือคุณสามารถใช้ชื่อของไฟล์ที่เรียกทำงานได้:

cpulimit -e myprogram -l 5

หรือพา ธ สัมบูรณ์ของไฟล์เรียกทำงาน:

cpulimit -P /path/to/myprogram -l 5

หมายเหตุเปอร์เซ็นต์นั้นเป็นของแกนทั้งหมด ดังนั้นถ้าคุณมี 4 คอร์คุณสามารถใช้ 400% ได้


1
ขอบคุณ! (1) CPULimit ใช้สำหรับกระบวนการที่เรียกใช้แล้วเท่านั้นหรือไม่ ไม่ใช้เมื่อส่งโปรแกรมเพื่อเรียกใช้หรือไม่ (2) แก้ไขเปอร์เซ็นต์การใช้ CPU โดยกระบวนการหรือตั้งค่าขีด จำกัด สูงสุดสำหรับกระบวนการและอนุญาตให้การใช้งานผันผวนระหว่าง 0 และขีด จำกัด นั้นตามกระบวนการอื่นหรือไม่ (3) ฉันยังพบว่าหลังจากใช้ CPULimit ในกระบวนการแล้วจะไม่มีวิธี Ctrl + C เพื่อยกเลิกการทำงานเพราะในไม่ช้ามันก็จะกลับมาทำงานโดยอัตโนมัติ สงสัยทำไม
ทิม

2
ข้อแม้เล็ก ๆ เกี่ยวกับ CPULimit: ใช้ SIGSTOP / SIGCONT เพื่อ จำกัด จำนวนเวลา CPU ที่ใช้โดยกระบวนการ (กระบวนการที่เกินกว่าการใช้งาน CPU เป้าหมายจะหยุดลงเมื่อเวลาผ่านไปกระบวนการจะส่ง SIGCONT และดำเนินการการดำเนินการต่อ) อย่างไรก็ตามมีบางกรณีที่สัญญาณสามารถรบกวนการเรียกของระบบดูรายละเอียดในคู่มือ GNU C library เนื่องจาก CPULimit ส่งสัญญาณเหล่านี้หลายครั้งต่อวินาทีจึงมีโอกาสค่อนข้างรบกวน ไม่ใช่ปัญหาใหญ่สำหรับการเรียกใช้ pdftk บนเดสก์ท็อป tho
Riccardo Murri

8

คุณสามารถreniceกระบวนการทำงานเพื่อให้มันมีความสำคัญมากขึ้นหรือน้อยลง (ที่เรียกว่า "ค่าที่ดี") โปรดทราบว่าสเกลลำดับความสำคัญของ UNIX ค่อนข้างตอบโต้ได้ง่าย: ค่าลบหมายถึงกระบวนการที่ได้รับความนิยมมากกว่ากระบวนการที่เกิดขึ้นพร้อมกันคือมีความสำคัญ "มากกว่า"

คุณสามารถลอง "ชะลอ" กระบวนการของคุณให้ PID ผ่าน:

# lower priority of a process
renice +1 "PID"

ทุกครั้งที่คุณเรียกใช้งานกระบวนการ "ค่าที่ดี" จะเพิ่มขึ้น 1 คุณสามารถใช้ค่าจำนวนเต็มนอกเหนือ+1จากแน่นอน

คำสั่งniceช่วยให้คุณเริ่มต้นกระบวนการด้วยการปรับค่า nice +10 (เปลี่ยนค่าด้วยตัวเลือก-n) ตัวอย่างเช่น:

# start a CPU-intensive task with low priority
nice ./cpu-hog

อย่างไรก็ตาม "ค่าที่ดี" จะมีผลกับจำนวนตัวกำหนดเวลาที่สนับสนุนการทำงานของกระบวนการอื่น ๆ ในระบบ: หากคอมพิวเตอร์ของคุณไม่ทำงานการเพิ่ม "ค่าที่ดี" ของกระบวนการเดียวจะไม่หยุดกระบวนการนั้นจากการรับ 100% ซีพียู ฉันอ้างอิงจากgetpriority manpage (2) : (เน้นที่เพิ่มโดยฉัน)

ระดับที่ค่าความสัมพันธ์สัมพัทธ์มีผลต่อการกำหนดเวลาของกระบวนการจะแตกต่างกันไปตามระบบ Unix และบน Linux ข้ามเคอร์เนลเวอร์ชัน เริ่มต้นด้วยเคอร์เนล 2.6.23, Linux ใช้อัลกอริทึมที่ทำให้เกิดความแตกต่างสัมพัทธ์ในค่าที่ดีเพื่อให้มีผลมากขึ้น สิ่งนี้ทำให้ค่า nice ต่ำมาก (+19) เพื่อให้ CPU เล็ก ๆ น้อย ๆ กับกระบวนการอย่างแท้จริงเมื่อใดก็ตามที่มี _higher priority load อื่น ๆในระบบ _

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

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


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

@Tim ฉันไม่คิดว่าสิ่งที่คุณถามเป็นไปได้; ฉันได้อัพเดตคำตอบพร้อมรายละเอียดเพิ่มเติมแล้ว หวังว่าจะทำให้ชัดเจนยิ่งขึ้น
Riccardo Murri

1
คำตอบอื่น ๆ แนะนำ CPULimit ซึ่งดูเหมือนว่าจะทำสิ่งที่เป็นไปไม่ได้
ทิม

อาฉันไม่รู้เกี่ยวกับ CPULimit แน่นอนมันเติมช่องว่างในชุดเครื่องมือ UNIX ของฉัน
Riccardo Murri

niceจะไม่ทำสิ่งใดให้โปรเซสเซอร์ของคุณเย็นลง มันไม่ได้ออกแบบมาให้ทำงานเช่นนั้น
Ken Sharp

4

กลุ่ม cgถูกสร้างขึ้นด้วยเหตุผลนี้

http://www.kernel.org/doc/Documentation/cgroups/ http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

ใช้เวลาสักครู่เพื่อทำความคุ้นเคยกับพวกเขาและฉันเชื่อว่าคุณต้องมีการเข้าถึงรูทเพื่อตั้งค่า แต่มันก็สามารถสคริปต์ได้ Ubuntus ที่ใหม่กว่ามีไฟล์. config เพื่อให้คุณไม่ต้องเขียนสคริปต์ของคุณเอง ฉันไม่แน่ใจเกี่ยวกับ 10.10

จุดเริ่มต้นที่ดีคือคำตอบนี้: https://askubuntu.com/a/94743/170177

โปรดทราบว่ากลุ่ม cg ยังอยู่ระหว่างการพัฒนาที่ใช้งานอยู่ดังนั้นคุณสมบัติบางอย่างอาจไม่พร้อมใช้งานในเคอร์เนลปัจจุบันของคุณ

การใช้cg.sharesของ cgroups ไม่ได้ทำสิ่งใดที่คุณค่าที่ดีจะไม่ทำ ดูเหมือนว่าคุณต้องการเร่งกระบวนการจริงๆซึ่งสามารถทำได้อย่างแน่นอน

คุณจะต้องใช้สคริปต์หนึ่งหรือสองตัวและ / หรือแก้ไข/etc/cgconfig.confเพื่อกำหนดพารามิเตอร์ที่คุณต้องการ

คุณต้องการแก้ไขค่าcpu.cfs_period_usและcpu.cfs_quota_usโดยเฉพาะ กระบวนการจะได้รับอนุญาตให้เรียกใช้สำหรับcpu.cfs_quota_us microseconds ต่อcpu.cfs_period_us microseconds

ตัวอย่างเช่น:

หากcpu.cfs_period_us = 50000และcpu.cfs_quota_us = 10,000กระบวนการจะได้รับ 20% ของเวลา CPU สูงสุดไม่ว่าจะเกิดอะไรขึ้นก็ตาม

ในภาพหน้าจอนี้ฉันได้ให้เวลา CPU 2% ของกระบวนการ:

เวลา CPU 2%

เท่าที่เกี่ยวข้องกับกระบวนการมันทำงานที่ 100%

การตั้งค่าcpu.sharesในอีกทางหนึ่งสามารถและจะยังคงใช้ 100% ของเวลา CPU ว่าง

ในตัวอย่างที่คล้ายกันนี้ฉันได้ให้กระบวนการcpu.shares = 100 (จาก 1024):

cpu.shares

ในขณะที่คุณสามารถดูกระบวนการยังคงใช้เวลา CPU ว่างทั้งหมด

อ้างอิง:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html


หมายเหตุ: systemdทำสิ่งต่าง ๆ เล็กน้อย ยกตัวอย่างเช่นอูบุนตูทรัสต์ดูเหมือนว่ามาพร้อมกับบริการสองอย่างเพื่อจัดการกลุ่ม cg ฉันจะอัปเดตเมื่อฉันรู้เพิ่มเติม
Ken Sharp

แต่คุณสามารถเปลี่ยน% cpu สูงสุดได้เมื่อกระบวนการเริ่มต้นขึ้นแล้วเช่นrenice?
Marco Sulla

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

renice does not change the amount of CPU usesฉันรู้ว่ามัน;) ฉันเพิ่งโพสต์เป็นตัวอย่างของโปรแกรมที่เปลี่ยนแปลงสิ่งที่รันไทม์ ขอบคุณสำหรับคำตอบของคุณฉันจะลอง cgroups
Marco Sulla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.