Czy uruchomić proces linux z bardzo niskim priorytetem?


12

Mam regularny proces, który nie jest tak ważny, ale zużywa tyle mocy procesora, i mam inny proces, który jest naprawdę ważny, ale spędza większość czasu bezczynnie, ale gdy dostanie pracę, naprawdę potrzebuje dużej mocy obliczeniowej

Próbowałem z systemem nice -20 ./low_priority_process, a nice --20 ./high_priority_processjednak wciąż niższy priorytet zużywają znaczną ilość CPU podczas wysokiego proces priorytetem jest w potrzebie, w jaki sposób można uruchomić proces, który będzie naprawdę produktywności lub nawet automatycznego zawieszenia, gdy inny proces wykorzystujący moc procesora


Jak ustalacie, że proces o wysokim priorytecie jest rzeczywiście potrzebny?
muru

spawnuje wiele wątków, albo proces
zjedzie

Użyj RRharmonogramu dla procesu o wysokim priorytecie.
Ramesh

@Ramesh Jaka to będzie różnica?
Ken Sharp

Odpowiedzi:


10

Spójrz na cgroups , powinien dostarczyć dokładnie to, czego potrzebujesz - rezerwacje procesora (i więcej). Sugerowałbym przeczytanie kontrolującego priorytetu aplikacji korzystających z cgroups .

To powiedziawszy, umieść ważne, ale często bezczynne procesy w grupie z przydzielonym 95% procesora, a inne aplikacje w inną z przydzielonym 5% - w razie potrzeby uzyskasz (prawie) całą moc na swoje zadania, podczas gdy proces głodny energii osiągnie w tym czasie najwyżej 5%. Kiedy przepływy obliczeniowe znikną, cała wydajność procesora spadnie na pozostałe procesy. Jako korzyść, jeśli utworzysz specjalną grupę (z minimalnymi wymaganiami wydajności) dla takich procesów sshd, będziesz mógł zalogować się bez względu na to, co próbuje uzyskać cały procesor, na jaki jest to możliwe - zarezerwowany zostanie pewien czas procesora sshd.


1
czy istnieje polecenie takie jak cpulimitlub nicemodyfikujące grupę procesów? ponieważ i jeśli cgroup jest wywołaniem API, to nie jestem w stanie przekompilować żadnej z tych aplikacji, aby użyć cgroup
uray

Nie, po prostu montujesz gdzieś hierarchię grupy, tworzysz katalogi dla poszczególnych grup i zapisujesz PID procesów w niektórych plikach. Wszystko to musi być wykonane jako root (a ściślej z odpowiednimi uprawnieniami). Niektóre systemy init (mianowicie systemd, przynajmniej w niektórych przypadkach) „kradną” interfejs cgroups od użytkowników, którzy muszą korzystać z interfejsu systemu init (zwykle specjalne polecenie). Przeczytaj link do odpowiedzi i artykuł w Wikipedii. Naprawdę. :)
Peter

Aha, jest też libcgrouppakiet, który zawiera narzędzia do pracy z cgroups, w tym daemon ( cgrulesengd), który może faktycznie sortować procesy na grupy w zależności od pewnych warunków.
peterph

7

Jeśli priorytet procesu (wartość ładna) jest niski, nie będzie to przerywać procesu o wyższym priorytecie. Powodem, dla którego proces o niskim priorytecie wciąż zużywa znaczną ilość procesora, gdy proces o wyższym priorytecie jest uruchomiony, jest fakt, że proces o wyższym priorytecie nie jest tak zajęty. Prawdopodobnie czeka na IO. Użyj, chrt -p -i 0 $PIDaby uruchomić proces z jeszcze niższym priorytetem niż nice 19 -p $PID(zakładając, że mówimy tutaj o Linuksie).

chrt -p -i 0 $PID umieszcza proces w „prawdziwym” bezczynnym harmonogramie.

http://linux.die.net/man/1/chrt


2
chrt -p -i 0 $ PID
Robert Foss

chrt to wciąż za mało. Staram się oglądać filmy, podczas gdy inne filmy w tle są ponownie kodowane. Korzystanie z chrt pomogło w przypadku filmów na youtube, ale mkvs bardzo wysokiej jakości nadal pomijają. Chciałem normalnie odtwarzać wideo, ale do ponownego kodowania wykorzystałem resztki mocy procesora, ponieważ mam ogromną porcję do zrobienia.
soger

0

Wypróbuj ten przykład, aby uruchomić proces jako proces niski.

Jeśli twoja praca jest niezła, tar xvf asets.zip

Posługiwać się

nice tar xvf resources.zip

Po tym problem

w górę, aby monitorować proces rozpakuj

ps aux | grep „smoła”

Wypróbuj coś konkretnego z cpulimit

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 python 0 9999999999> / dev / null &


tak, -20to „niski priorytet” i --20„wysoki priorytet”, spójrz na podwójny myślnik dla nicepolecenia. i tak, rozumiem całkowicie dobrą wartość, ale moje pytanie brzmi: czy istnieje sposób, aby powiedzieć harmonogramowi inne niż używanie dobrej wartości
uray

2
@ user77710 jesteś pewien? Ani strona podręcznika Ubuntu, ani strona POSIX nie określają tej składni. Zarówno wykorzystanie -n -20, -n 20itd.
muru

tak, cokolwiek, składnia nie jest ważna, moim celem jest ustalenie ładnej wartości bardzo niskiej i bardzo wysokiej dla obu procesów, nie daje wyniku tego, co chciałem
uray

2
@ user77710 CO? „składnia nie jest ważna”? Skąd możesz mieć pewność, że ustawiasz wartości nicości?
muru

bo widzę wartość procesową na miły htoplub toplub pslub cokolwiek
uraj

-1

Dla przyszłych przybysze, tutaj jest pełna przykładów niceze stresem .

  1. Maszyna testowa ma 2 procesory
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Zainstaluj stress:apt-get install stress
  2. Spraw, aby 2 procesory były zajęte wywołaniem o niskim priorytecie, aby wywołać stres: nice -20 stress --cpu 2
  3. Sprawdź użycie procesora za pomocą top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

To pokazuje, że oba procesory są w pełni zajęte.

  1. Uruchom proces obciążania pojedynczym procesorem o wysokim priorytecie: nice --20 stress --cpu 1
  2. Sprawdź użycie procesora ponownie za pomocą top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

To pokazuje, że proces stresu jednordzeniowego uzyskuje pełny procesor, podczas gdy procesy o niższym priorytecie dzielą pozostałe 1 procesor

  1. Z drugiej strony zabicie wszystkich powyższych stresswywołań i wywołanie jednego 3-procesowego stress --cpu 3dałoby 66% procesora każdemu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.