Przetwarzaj „uprzejmość” vs. „priorytet”

104

Podczas działania topwidzę następujące (skrócone) przykładowe dane wyjściowe:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

Są dwie wartości, którymi jestem zainteresowany: PR(Priorytet) i NI(Wolność).

Jeśli zrozumiałem to, co już odkryłem poprawnie, oboje określają, ile czasu procesora osiągnie proces w przeciwieństwie do innych procesów. Ale jaka jest różnica między tymi wartościami?

Czy możesz również opisać, jak manipulować tymi wartościami procesu i w jakich okolicznościach może to być przydatne?

Bajt Dowódca
źródło

Odpowiedzi:

103

Dobra wartość to przestrzeń użytkownika, a priorytetem PR jest rzeczywisty priorytet procesu, którego używa jądro Linuksa. W systemie Linux priorytety wynoszą od 0 do 139, w tym od 0 do 99 w czasie rzeczywistym i od 100 do 139 dla użytkowników. ładny zakres wartości wynosi od -20 do +19, gdzie -20 jest najwyższy, 0 domyślnie, a +19 jest najniższy. relacja między ładną wartością a priorytetem jest:

PR = 20 + NI

więc wartość PR = 20 + (-20 to +19)wynosi od 0 do 39, która odwzorowuje od 100 do 139.

Zgodnie z najlepszą instrukcją:

PR - Priorytet Priorytet harmonogramu zadania. Jeśli zobaczysz „rt” w tym polu, oznacza to, że zadanie działa z priorytetem planowania „w czasie rzeczywistym”.

NI to niezła wartość zadania.

NI - Dobra wartość Dobra wartość zadania. Ujemna wartość ujemna oznacza wyższy priorytet, podczas gdy dodatnia wartość Nicea oznacza niższy priorytet. Zero w tym polu oznacza po prostu, że priorytet nie będzie korygowany przy określaniu zdolności wysyłania zadania

Edycja: Domyślnie, gdy program jest uruchamiany w systemie Linux, jest uruchamiany z priorytetem „0”. Możesz jednak zmienić priorytet swoich programów za pomocą jednej z następujących metod.

  1. Możesz uruchomić program z wymaganym priorytetem za pomocą

    nice -n nice_value program_name
    
  2. możesz także zmienić priorytet już uruchomionego procesu za pomocą

    renice -n nice_value -p process_id
    
pl_rock
źródło
1
Czy mówisz, że są prawie takie same na odwrót (oba reprezentują priorytet) ALE nicenessmogą być użyte do nadania negatywnego priorytetu, aby zadanie nicenesszejdzie z drogi dla zadań o wysokim priorytecie? (tj. bycie nicei pozwalanie innym zasobom na dostęp? A może to mnie pomyliło?
Mark Kirby,
1
Przykład tego, co mam na myśli, dwa zadania, oba mają pr20, więc równe, zadanie pierwsze ma wartość ni0, a zadanie drugie ma wartość ni20, więc oznaczałoby to, że zadanie drugie oddałoby zasoby dla zadania pierwszego, ponieważ jestnicer
Mark Kirby,
1
Jak wiem, priorytet obliczony jako PR = 20 + NI. więc zadaj jeden priorytet = 20 +0. maksymalna wartość
grzeczności
3
PR = 20 + maksymalna wartość NI może wynosić 39. tak naprawdę w systemie Linux jest 139 priorytet, w którym od 0 do 99 jest priorytetem w czasie rzeczywistym, a dla użytkownika od 100 do 139. więc wartość NI od -20 do +19 odwzorowuje na priorytet od 100 do 139. które możesz dostosować. ale nadal jądro nie jest pewne, czy zmienisz wartość NI, to zmieni priorytet, wartość NI jest po prostu sugestią dla jądra. jądro trochę zignorowało
pl_rock
1
Czy zatem PR i NI są faktycznie równoważne, ponieważ mają tylko inne przesunięcie? Dlaczego mamy zatem obie wartości? I możesz dodać, że ustawienie nieważności procesu <0 wymaga uprawnień roota.
Bajt Dowódca
26

Co to jest priorytet i dlaczego powinienem się tym przejmować?

Mówiąc o procesach, priorytetem jest zarządzanie czasem procesora. Procesor lub procesor jest jak człowiek żonglujący wieloma zadaniami jednocześnie. Czasami możemy mieć wystarczająco dużo miejsca na wiele projektów. Czasami możemy skupić się tylko na jednej rzeczy na raz. Innym razem pojawia się coś ważnego i chcemy poświęcić całą naszą energię na rozwiązanie tego problemu, jednocześnie nakładając mniej ważne zadania na tylny palnik.

W Linuksie możemy ustawić wytyczne dla procesora, który powinien podążać, gdy analizuje wszystkie zadania, które musi wykonać. Te wytyczne nazywa się uprzejmością lub niezłą wartością. Skala nicości Linuksa wynosi od -20 do 19. Im niższa liczba, tym większy priorytet otrzymuje zadanie. Jeśli wartość niceness jest wysoka, np. 19, zadanie zostanie ustawione na najniższy priorytet, a procesor przetworzy je, gdy tylko będzie taka szansa. Domyślna niezła wartość to zero.

Korzystając z tej skali, możemy lepiej alokować nasze zasoby procesora. Programy o niższym priorytecie, które nie są ważne, można ustawić na wyższą ładną wartość, natomiast programy o wysokim priorytecie, takie jak demony i usługi, można ustawić tak, aby bardziej skupiały się na procesorze. Możesz nawet przypisać konkretnemu użytkownikowi niższą wartość dla wszystkich jego procesów, aby ograniczyć jego zdolność do spowalniania podstawowych usług komputera.

Źródło

Ustaw priorytet nowych procesów za pomocą nicenp

nice -n 10 firefox

dla istniejących procesów

renice 10 -p $(pgrep firefox)

Aby ustawić priorytet, <0którego potrzebujesz sudo, np .:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

ale nie dla priorytetu >=0


Przykład

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

Inny przykład

Aby ponownie uruchomić wszystkie uruchomione procesy dla określonego użytkownika

renice 20 -u user_name
AB
źródło
W twoim przykładzie renice 10działałoby to również bez sudo, prawda? Czy możesz dodać przykład, aby uprościć wszystkie procesy konkretnego użytkownika? Byłoby to naprawdę przydatne, gdyby ktoś inny był zalogowany w tym samym czasie i miał uruchomione kilka niepotrzebnych, ale pochłaniających zasoby procesów (jak w przypadku wstrzymanej gry flash w Firefox, młodsi bracia robią takie rzeczy ...: - /)
Bajt Dowódca
@ByteCommander zrobione =)
AB
Jak po pewnym czasie przywrócić stare wartości tego użytkownika? Ustawiasz z powrotem na 0? To nie bierze pod uwagę, że niektóre procesy mogły wcześniej mieć inną wartość. Czy jest jakaś prosta możliwość to zrobić?
Bajt Dowódca
@ByteCommander Nie, to nie jest proste. Albo użyjesz, 0albo… jest problem;)
AB
2
Po Renice -19, z wynikiem psjest: PRI: 38, NI: -19jednak, ze topjest PR:1, NI -19to dlaczego?
pobudka
14

Krótka odpowiedź

PR jest poziomem priorytetowym. Im niższy PR, tym wyższy będzie priorytet procesu.

PR oblicza się w następujący sposób:

  • dla normalnych procesów: PR = 20 + NI (NI jest miły i wynosi od -20 do 19)
  • dla procesów w czasie rzeczywistym: PR = - 1 - real_time_priority (real_time_priority wynosi od 1 do 99)

Długa odpowiedź

Istnieją 2 rodzaje procesów, normalny i rzeczywisty. Dla normalnych (i tylko dla tych) nice stosuje się w następujący sposób:

Miły

Skala „dobroci” wynosi od -20 do 19, podczas gdy -20 jest najwyższym priorytetem, a 19 najniższym. Poziom priorytetu jest obliczany w następujący sposób:

PR = 20 + NI

Gdzie NI to niezły poziom, a PR to poziom priorytetowy. Jak widać, -20 faktycznie odwzorowuje na 0, a 19 na 39.

Domyślnie wartość nice programu wynosi 0, ale użytkownik root może uruchamiać programy o określonej wartości nice za pomocą następującego polecenia:

nice -n <nice_value> ./myProgram 

Czas rzeczywisty

Możemy pójść jeszcze dalej. Dobry priorytet jest faktycznie używany w programach użytkownika. Podczas gdy ogólny priorytet UNIX / LINUX ma zakres 140 wartości, ładna wartość umożliwia procesowi mapowania do ostatniej części zakresu (od 100 do 139). To równanie pozostawia wartości od 0 do 99 nieosiągalne, co odpowiada ujemnemu poziomowi PR (od -100 do -1). Aby mieć dostęp do tych wartości, proces należy określić jako „w czasie rzeczywistym”.

Istnieje 5 zasad planowania w środowisku LINUX, które można wyświetlić za pomocą następującego polecenia:

chrt -m 

Który pokaże następującą listę:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Procesy szeregowania można podzielić na 2 grupy, normalne zasady szeregowania (od 1 do 3) i zasady szeregowania w czasie rzeczywistym (4 i 5). Procesy w czasie rzeczywistym zawsze będą miały pierwszeństwo przed normalnymi procesami. Proces w czasie rzeczywistym można wywołać za pomocą następującego polecenia (na przykład, jak zadeklarować zasadę SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Aby uzyskać wartość PR dla procesu w czasie rzeczywistym, stosuje się następujące równanie:

PR = -1 - rt_prior

Gdzie rt_prior odpowiada priorytetowi między 1 a 99. Z tego powodu proces, który będzie miał wyższy priorytet niż inne procesy, będzie wywoływany z liczbą 99.

Należy zauważyć, że w procesach w czasie rzeczywistym wartość nice nie jest używana.

Aby zobaczyć bieżącą „wartość” i wartość PR procesu, można wykonać następujące polecenie:

top

Który pokazuje następujące dane wyjściowe:

wprowadź opis zdjęcia tutaj

Na rysunku wyświetlane są wartości PR i NI. Warto odnotować proces o wartości PR -51, która odpowiada wartości w czasie rzeczywistym. Istnieją również procesy, których wartość PR jest określona jako „rt”. Ta wartość faktycznie odpowiada wartości PR -100.

Agustin Barrachina
źródło