Spowolnij tylko jeden proces regulacji temperatury procesora

9
  1. Mam program Podczas pracy temperatura procesora wzrasta z 50 do 80 stopni Celsjusza, co jest moim głównym zmartwieniem.

    Mogę kontrolować częstotliwość procesora, aby go spowolnić, ale inne procesy również zostaną spowolnione, czego nie chcę.

    Czy możliwe jest spowolnienie określonego procesu bez wpływu na inne procesy w celu utrzymania niskiej temperatury procesora?

    Mój system operacyjny to Ubuntu 10.10.

  2. Próbowałem ustawić priorytet procesu nice -n 15 myprogrami nie jestem pewien, czy to zadziała. Procesor ma 77 Celsjusza.

    Czy niceustawia tylko względny priorytet procesu względem innych procesów? To znaczy, jeśli inne procesy nie są uruchomione, czy ten udoskonalony proces będzie działał szybko? Chciałbym ustawić proces, aby cały czas działał powoli.

Tim
źródło
1
Co robi ten proces: ciężkie wejście / wyjście? Ciężkie obliczenia na głównym procesorze? Ciężkie obliczenia na GPU (karcie graficznej) (zwykle, ale nie wyłącznie, programy obliczające obrazy)?
Gilles „SO- przestań być zły”,
Program to pdf2djvu, konwertujący plik pdf na djvu. Czy to ciężkie We / Wy, czy ciężki procesor, czy ciężki procesor graficzny? Czy masz różne sposoby na różne przypadki?
Tim
4
80º jest bardzo bardzo wysokie. Mieszkam w gorącym miejscu Hiszpanii, a maksymalna temperatura mojego procesora wynosi ~ 60º. Otwórz komputer, wyczyść wszystkie elementy i wymień chłodnice. Myślę, że nie używasz procesora.
Rufo El Magufo
Spróbuj zrobić jedno i drugie.
stribika
80 ° jest w rzeczywistości wysokie, ale nie jest uważane za ekstremalne w zależności od modelu procesora. większość procesorów obsługuje do 90 ° C bez problemu
Kiwy

Odpowiedzi:

16

CPULimit jest dokładnie tym, czego potrzebujesz. Uruchom program, a następnie uruchom cpulimit dla nazwy programu lub PID, określając, jaki procent ma być ograniczony.

Następujące polecenie ogranicza proces na PID 7777 do 5% użycia procesora.

cpulimit -p 7777 -l 5

Alternatywnie możesz użyć nazwy pliku wykonywalnego:

cpulimit -e myprogram -l 5

Lub bezwzględna ścieżka do pliku wykonywalnego:

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

Zauważ, że procent dotyczy wszystkich rdzeni; więc jeśli masz 4 rdzenie, możesz użyć 400%.

laebshade
źródło
1
Dzięki! (1) Czy CPULimit jest używany tylko dla już uruchomionego procesu? Nie używany podczas przesyłania programu do uruchomienia? (2) czy ustala procent wykorzystania procesora przez proces, czy też ustawia górny limit dla procesu i pozwala na wahanie jego wykorzystania między 0 a tym limitem zgodnie z innymi procesami? (3) Odkryłem również, że po użyciu CPULimit w procesie nie ma możliwości, aby Ctrl + C anulował uruchamianie, ponieważ wkrótce wróci do automatycznego uruchamiania. Zastanawiać się, dlaczego?
Tim
2
Małe zastrzeżenie dotyczące CPULimit: używa SIGSTOP / SIGCONT, aby ograniczyć ilość czasu procesora wykorzystywanego przez proces (procesy przekraczające docelowe użycie procesora zostają zatrzymane; po upływie wystarczającego czasu proces jest wysyłany SIGCONT i wznawia wykonywanie). Istnieją jednak rzadkie przypadki, w których sygnały mogą kolidować z wywołań systemowych, zobacz instrukcję biblioteka GNU C aby poznać szczegóły. Ponieważ CPULimit wysyła te sygnały wiele razy na sekundę, istnieje duża szansa na przerwanie. Nie jest to duży problem z uruchamianiem pdftk na pulpicie.
Riccardo Murri,
8

Można zmienić tą uruchomionego procesu, aby nadać jej bardziej lub mniej priorytet (tzw „nice value”). Zauważ, że skala priorytetów UNIX jest nieco sprzeczna z intuicją: wartości ujemne oznaczają, że proces jest faworyzowany w stosunku do równoczesnych procesów, tj. Ma „wyższy” priorytet.

Możesz zatem spróbować spowolnić proces, biorąc pod uwagę jego PID poprzez:

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

Za każdym razem, gdy to uruchomisz, proces „ładna wartość” jest zwiększany o 1; możesz użyć wartości całkowitych innych niż +1oczywiście.

Polecenie nice pozwala rozpocząć proces z korektą wartości nice +10 (zmień to za pomocą opcji -n). Na przykład:

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

Jednak „ładna wartość” wpływa tylko na to, jak bardzo harmonogram preferuje uruchomienie określonego procesu w porównaniu z innymi w systemie: jeśli komputer jest w zasadzie na biegu jałowym, podniesienie „ładnej wartości” jednego procesu nie powstrzyma tego procesu przed pobraniem 100% PROCESOR. Cytuję na stronie getpriority (2) : (Podkreślenie dodane przeze mnie.)

Stopień, w jakim ich względna niezła wartość wpływa na planowanie procesów, jest różna w różnych systemach Unix, a w Linuksie w zależności od wersji jądra. Począwszy od jądra 2.6.23, Linux przyjął algorytm, który powoduje, że względne różnice w ładnych wartościach mają znacznie silniejszy efekt. Powoduje to, że bardzo niskie wartości ładne (+19) naprawdę zapewniają procesorowi niewielki proces, ilekroć w systemie występuje inne _większące priorytetowe obciążenie ._

Powodem tego jest sposób, w jaki procesy są uruchamiane na jądrze typu UNIX: za każdym razem, gdy jądro decyduje się na uruchomienie procesu, proces ten ma pełną kontrolę nad rdzeniem procesora przez określony (stały i krótki) okres czasu. „Dobra wartość” może wpływać na to, jak często program planujący jądro chce nadać przedział czasowy procesowi, ale nie można zmienić faktu, że po zaplanowaniu proces działa nieprzerwanie przez ustalony czas.

Dlatego, poza spowolnieniem procesora, nie ma sposobu, aby proces działał wolniej, jeśli w systemie nie ma innych procesów, które mogłyby walczyć o dostęp do procesora.

Riccardo Murri
źródło
Dzięki! Czy można spowolnić proces od początku do końca, niezależnie od innych procesów?
Tim
@ Tim Nie sądzę, że to, o co prosisz, jest możliwe; Zaktualizowałem odpowiedź o więcej szczegółów. Mam nadzieję, że to wyjaśnia.
Riccardo Murri
1
Druga odpowiedź sugerowała CPULimit, co wydaje się robić rzeczy niemożliwe.
Tim
Ach, nie wiedziałem o CPULimit - zdecydowanie wypełnia lukę w moim zestawie narzędzi UNIX.
Riccardo Murri,
nicenie zrobi nic, aby utrzymać twój procesor chłodny. Nie jest przeznaczony do takiego działania.
Ken Sharp,
4

grupy c zostały utworzone właśnie z tego powodu.

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

Zapoznanie się z nimi zajmuje trochę czasu i uważam, że potrzebujesz dostępu do konta root, aby je skonfigurować, ale wszystko to można wykonać za pomocą skryptów. Nowsze Ubuntus ma plik .conf, dzięki czemu nie musisz pisać własnego skryptu. Nie jestem pewien co do 10.10.

Miłym miejscem do rozpoczęcia jest ta odpowiedź: https://askubuntu.com/a/94743/170177

Zauważ, że cgroups jest wciąż w fazie rozwoju, więc niektóre funkcje mogą być niedostępne w twoim obecnym jądrze.

Korzystanie z cpu.shares cgroups nie robi nic, czego nie zrobiłaby dobra wartość. Wygląda na to, że naprawdę chcesz zdławić procesy, co z pewnością można zrobić.

Musisz użyć skryptu lub dwóch i / lub edytować /etc/cgconfig.conf, aby zdefiniować parametry, które chcesz.

W szczególności chcesz edytować wartości cpu.cfs_period_us i cpu.cfs_quota_us . Proces będzie wtedy mógł działać przez cpu.cfs_quota_us mikrosekund na cpu.cfs_period_us mikrosekund.

Na przykład:

Jeśli cpu.cfs_period_us = 50000 i cpu.cfs_quota_us = 10000, wówczas proces otrzyma maksymalnie 20% czasu procesora, bez względu na to, co się dzieje.

Na tym zrzucie ekranu podałem procesowi 2% czasu procesora:

2% czasu procesora

Jeśli chodzi o proces, przebiega on w 100%.

Z drugiej strony ustawienia cpu.shares mogą i nadal będą wykorzystywać 100% czasu bezczynności procesora.

W tym podobnym przykładzie podałem proces cpu.shares = 100 (z 1024):

akcje procesora

Jak widać, proces ten zużywa cały czas bezczynności procesora.

Bibliografia:

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

Ken Sharp
źródło
Uwaga: systemdrobi to trochę inaczej. Na przykład Ubuntu Trusty wydaje się być wyposażony w dwie usługi do zarządzania grupami. Zaktualizuję, gdy będę wiedział więcej.
Ken Sharp,
Ale możesz zmienić maksymalny% procesora, gdy proces jest już uruchomiony, jak renice?
Marco Sulla
renicenie zmienia ilości używanego procesora, po prostu zmienia priorytet procesu w harmonogramie. cgroups mogą zmienić limit procesora w dowolnym momencie. Od czasu opublikowania tej odpowiedzi do grup cg dodane zostały różnego rodzaju poprawki i są bardzo potężne.
Ken Sharp
renice does not change the amount of CPU usesWiem o tym;) Właśnie opublikowałem jako przykład programu, który zmienia rzeczy w czasie wykonywania. Dziękuję za odpowiedź, spróbuję cgroups.
Marco Sulla