Làm chậm chỉ một quá trình để điều chỉnh nhiệt độ CPU


9
  1. Tôi có một chương trình. Khi nó chạy, nhiệt độ CPU tăng từ 50 đến 80 Celcius, đó là mối quan tâm chính của tôi.

    Tôi có thể kiểm soát tần số CPU để làm chậm nó, nhưng các quá trình khác cũng sẽ bị chậm lại mà tôi không muốn.

    Có thể làm chậm một quá trình cụ thể mà không ảnh hưởng đến các quá trình khác để giữ cho CPU mát?

    Hệ điều hành của tôi là Ubuntu 10.10.

  2. Tôi đã cố gắng đặt mức độ ưu tiên của quá trình nice -n 15 myprogram, và không chắc điều đó có hiệu quả không. CPU cao 77 Celcius.

    Có phải nicechỉ đặt mức độ ưu tiên tương đối của một quy trình wrt các quy trình khác? Tức là, nếu các quy trình khác không chạy, liệu quy trình này có chạy nhanh không? Tôi muốn thiết lập quy trình để chạy chậm tất cả.


1
Quá trình này làm gì: đầu vào / đầu ra nặng? Tính toán nặng nề trên CPU chính? Tính toán nặng trên GPU (card màn hình) (thường nhưng không giới hạn ở các chương trình tính toán hình ảnh)?
Gilles 'SO- ngừng trở nên xấu xa'

Chương trình là pdf2djvu, chuyển đổi tập tin pdf thành djvu. Đó là IO nặng hay CPU nặng hay GPU nặng? Bạn có cách khác nhau cho các trường hợp khác nhau?
Tim

4
80º là rất rất cao. Tôi sống ở một nơi nóng của Tây Ban Nha và nhiệt độ tối đa của bộ xử lý của tôi là ~ 60 .. Mở máy tính, làm sạch tất cả các mảnh và thay đổi bộ làm mát. Tôi nghĩ rằng bạn không sử dụng CPU.
Rufo El Magufo

Hãy thử làm cả hai.
stribika

80 ° thực sự cao nhưng không được coi là cực đoan tùy thuộc vào mô hình CPU. hầu hết CPU hỗ trợ lên tới 90 ° C mà không gặp vấn đề gì
Kiwy

Câu trả lời:


16

CPULimit chính xác là những gì bạn cần. Bạn khởi động chương trình, sau đó chạy cpulimit với tên chương trình hoặc PID, chỉ định phần trăm bạn muốn giới hạn.

Lệnh sau giới hạn quá trình sử dụng CPU ở mức 7777 đến 5%.

cpulimit -p 7777 -l 5

Ngoài ra, bạn có thể sử dụng tên của tệp thực thi:

cpulimit -e myprogram -l 5

Hoặc đường dẫn tuyệt đối của tệp thực thi:

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

Lưu ý tỷ lệ phần trăm là của tất cả các lõi; Vì vậy, nếu bạn có 4 lõi, bạn có thể sử dụng 400%.


1
Cảm ơn! (1) CPULimit chỉ được sử dụng cho quy trình đã chạy chưa? Không được sử dụng khi gửi một chương trình để chạy? (2) nó có sửa lỗi phần trăm sử dụng CPU theo một quy trình hay đặt giới hạn trên cho quy trình và cho phép sử dụng của nó dao động trong khoảng từ 0 đến giới hạn đó theo các quy trình khác không? (3) Tôi cũng thấy rằng sau khi sử dụng CPULimit trên một quy trình, không có cách nào để Ctrl + C hủy bỏ hoạt động, bởi vì nó sẽ sớm quay trở lại để chạy tự động. Tự hỏi tại sao?
Tim

2
Một cảnh báo nhỏ về CPULimit: nó sử dụng SIGSTOP / SIGCONT để giới hạn thời gian CPU được sử dụng bởi một quy trình (các quá trình vượt quá mức sử dụng CPU mục tiêu bị dừng lại, khi đủ thời gian, quá trình được gửi SIGCONT và tiếp tục thực thi). Tuy nhiên, hiếm có trường hợp tín hiệu nào có thể can thiệp vào các cuộc gọi hệ thống, xem hướng dẫn sử dụng thư viện GNU C để biết chi tiết. Vì CPULimit gửi các tín hiệu này nhiều lần trong một giây, nên có nhiều khả năng bị gián đoạn. Không phải là một vấn đề lớn để chạy pdftk trên máy tính để bàn, tho.
Riccardo Murri

8

Bạn có thể renice một quá trình chạy để cho nó nhiều hơn hoặc ít ưu tiên (cái gọi là "nice value"). Lưu ý rằng thang ưu tiên UNIX có phần phản trực giác: các giá trị âm có nghĩa là một quy trình được ưa chuộng hơn các quy trình đồng thời, nghĩa là nó có mức độ ưu tiên "nhiều hơn".

Do đó, bạn có thể cố gắng "làm chậm" quá trình của mình khi đưa ra thông qua:

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

Mỗi khi bạn chạy cái này, quá trình "giá trị tốt đẹp" được tăng lên 1; bạn có thể sử dụng các giá trị số nguyên khác với +1khóa học.

Lệnh Nice cho phép bạn bắt đầu một quy trình với điều chỉnh giá trị đẹp +10 (thay đổi tùy chọn này bằng tùy chọn -n). Ví dụ:

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

Tuy nhiên, "giá trị tốt" chỉ ảnh hưởng đến mức độ mà bộ lập lịch ưu tiên chạy một quy trình cụ thể so với các hệ thống khác trong hệ thống: nếu máy tính của bạn về cơ bản không hoạt động, việc nâng "giá trị đẹp" của một quy trình sẽ không ngăn quá trình đó chiếm 100% CPU. Tôi trích dẫn từ trang web getp Warriority (2) : (Nhấn mạnh thêm bởi tôi.)

Mức độ mà giá trị tương đối tốt của chúng ảnh hưởng đến việc lập lịch trình cho các quy trình khác nhau trên các hệ thống Unix và trên Linux, trên các phiên bản kernel. Bắt đầu với kernel 2.6,23, Linux đã áp dụng một thuật toán gây ra sự khác biệt tương đối trong các giá trị đẹp để có hiệu ứng mạnh hơn nhiều. Điều này khiến các giá trị đẹp rất thấp (+19) thực sự cung cấp ít CPU cho một tiến trình bất cứ khi nào có bất kỳ tải ưu tiên cao hơn nào khác trên hệ thống._

Lý do cho điều này nằm trong cách các tiến trình được chạy trên kernel giống UNIX: mỗi khi kernel quyết định chạy tiến trình, quá trình đó có toàn quyền kiểm soát lõi CPU trong một khoảng thời gian nhất định (cố định và ngắn). "Giá trị đẹp" có thể ảnh hưởng đến tần suất bộ lập lịch kernel sẵn sàng cung cấp khe thời gian cho một quy trình, nhưng bạn không thể thay đổi thực tế rằng, một khi được lên lịch, một quy trình sẽ không bị xáo trộn trong một khoảng thời gian cố định.

Do đó, việc làm chậm CPU của bạn, không có cách nào để làm cho quá trình chạy chậm hơn nếu không có các quy trình khác trong hệ thống có thể tranh giành quyền truy cập CPU.


Cảm ơn! Có thể làm cho một quá trình chạy chậm từ đầu đến cuối, bất kể các quá trình khác không?
Tim

@Tim Tôi không nghĩ những gì bạn yêu cầu là có thể; Tôi đã cập nhật câu trả lời với nhiều chi tiết hơn. Hy vọng rằng làm cho nó rõ ràng hơn.
Riccardo Murri

1
Các trả lời khác đề nghị CPULimit, dường như làm điều không thể.
Tim

À, tôi không biết về CPULimit - nó chắc chắn lấp đầy một khoảng trống trong bộ công cụ UNIX của tôi.
Riccardo Murri

niceSẽ không làm điều gì để giữ cho bộ xử lý của bạn mát mẻ. Nó không được thiết kế để làm việc như vậy.
Ken Sharp

4

cgroups đã được tạo ra cho chính xác lý do này.

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

Phải mất một chút thời gian để làm quen với họ và tôi tin rằng bạn cần quyền truy cập root để thiết lập chúng, nhưng tất cả đều có thể được viết kịch bản. Ubuntus mới hơn có tệp .conf để bạn không phải viết tập lệnh của riêng mình. Tôi không chắc chắn về 10.10.

Một nơi tốt đẹp để bắt đầu là trong câu trả lời này: https://askubfox.com/a/94743/170177

Lưu ý rằng các nhóm vẫn đang được phát triển tích cực nên một số tính năng có thể không khả dụng trong kernel hiện tại của bạn.

Sử dụng cpu.shares của cgroups không có gì mà giá trị tốt đẹp sẽ không làm được. Có vẻ như bạn muốn thực sự điều tiết các quá trình, điều này chắc chắn có thể được thực hiện.

Bạn sẽ cần sử dụng một hoặc hai tập lệnh và / hoặc chỉnh sửa /etc/cgconfig.conf để xác định các tham số bạn muốn.

Cụ thể, bạn muốn chỉnh sửa các giá trị cpu.cfs_apse_uscpu.cfs_quota_us . Quá trình sau đó sẽ được phép chạy cho cpu.cfs_quota_us micro giây trên mỗi cpu.cfs_apse_us microseconds.

Ví dụ:

Nếu cpu.cfs_apse_us = 50000cpu.cfs_quota_us = 10000 thì quá trình sẽ nhận được 20% thời gian tối đa của CPU, bất kể điều gì đang xảy ra.

Trong ảnh chụp màn hình này, tôi đã đưa ra quá trình 2% thời gian của CPU:

Thời gian CPU 2%

Theo như quá trình này, nó đang hoạt động ở mức 100%.

Mặt khác, cài đặt cpu.shares có thể và vẫn sẽ sử dụng 100% thời gian CPU nhàn rỗi.

Trong ví dụ tương tự này, tôi đã đưa ra quy trình cpu.shares = 100 (của 1024):

cpu.shares

Như bạn có thể thấy quá trình vẫn đang tiêu tốn tất cả thời gian CPU nhàn rỗi.

Người giới thiệu:

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


Lưu ý: systemdlàm mọi thứ một chút khác nhau. Ví dụ, Ubuntu Trusty dường như đi kèm với hai dịch vụ để quản lý các nhóm. Tôi sẽ cập nhật khi tôi biết nhiều hơn.
Ken Sharp

Nhưng bạn có thể thay đổi% cpu tối đa khi quá trình đã bắt đầu, như renice?
Marco Sulla

renicekhông thay đổi số lượng CPU được sử dụng, nó chỉ thay đổi mức độ ưu tiên của quy trình trong bộ lập lịch. cgroups có thể thay đổi giới hạn CPU bất cứ lúc nào. Vì câu trả lời này đã được đăng nên các nhóm đã có tất cả các loại tinh chỉnh được thêm vào và rất mạnh mẽ.
Ken Sharp

renice does not change the amount of CPU usesTôi biết điều đó;) Tôi chỉ đăng một ví dụ về một chương trình thay đổi mọi thứ trong thời gian chạy. Cảm ơn bạn đã trả lời, tôi sẽ thử cgroups.
Marco Sulla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.