Różnica między ładną wartością a priorytetem w najwyższej wydajności

11

top domyślnie wyświetla obie kolumny. Jestem ciekawy, jaka jest różnica. Sprawdziłem strony podręcznika i nie mogę tego rozgryźć:

Priorytet:

   h: PR  --  Priority
      The priority of the task.

Dobra wartość:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

Rozumiem, że wartość Nicea jest związana z kolejką harmonogramu CPU jądra; to co oznacza priorytet ? Być może coś dotyczy wejścia / wyjścia?

Belmin Fernandez
źródło

Odpowiedzi:

8

Miłą wartość jest „globalny” mechanizm, podczas gdy priorytetem jest istotne dla przełącznika zadań teraz .

Ignacio Vazquez-Abrams
źródło
Co rozumiesz przez przełącznik zadań?
Belmin Fernandez
1
Przełącznik zadań (właściwie nazywany „harmonogramem”) to trochę kodu w jądrze, który decyduje, które zadanie zostanie uruchomione w następnej kolejności.
Ignacio Vazquez-Abrams
25

Różnica polega na tym, że PR jest w tej chwili prawdziwym priorytetem procesu w jądrze, a NI jest jedynie wskazówką dla jądra, jaki priorytet powinien mieć proces.

W większości przypadków wartość PR można obliczyć według następującego wzoru: PR = 20 + NI . Zatem proces z nicością 3 ma priorytet 23 (20 + 3), a proces z nicią -7 ma priorytet 13 (20 - 7). Możesz sprawdzić pierwszy, uruchamiając polecenie nice -n 3 top. Pokaże, że najwyższy proces ma NI 3 i PR 23 . Ale do działania nice -n -7 topw większości systemów Linux musisz mieć uprawnienia roota, ponieważ w rzeczywistości niższa wartość PR jest tym wyższym priorytetem. Zatem proces z PR 13 ma wyższy priorytet niż procesy ze standardowym priorytetem PR 20. Dlatego musisz być rootem. Ale minimalną dopuszczalną wartość dla procesu innego niż root można skonfigurować w /etc/security/limits.conf .

Teoretycznie jądro może samo zmieniać wartość PR (ale nie NI ). Na przykład może zmniejszyć priorytet procesu, jeśli zużywa zbyt dużo procesora, lub może zwiększyć priorytet procesu, jeśli proces ten nie miał szansy działać przez długi czas z powodu innych procesów o wyższym priorytecie. W takich przypadkach wartość PR zostanie zmieniona przez jądro, a NI pozostanie taki sam, dlatego formuła „PR = 20 + NI” nie będzie poprawna. Tak więc wartość NI może być interpretowana jako wskazówka dla jądra, jaki priorytet powinien mieć proces, ale jądro może samodzielnie wybrać rzeczywisty priorytet ( wartość PR ) w zależności od sytuacji. Ale zwykle formuła„PR = 20 + NI” jest poprawne.

Dokładne zasady zmiany priorytetu jądra nie są jasne. Instrukcja setpriority (funkcja, która zmienia niezłą wartość) mówi:

Efekt zmiany wartości Nicei może się różnić w zależności od obowiązującego algorytmu szeregowania procesów.

Podręcznik Pthread mówi:

Dynamiczny priorytet jest oparty na wartości Nicei (ustawianej przez nice (2), setpriority (2) lub schedul_setattr (2)) i zwiększany za każdym razem, gdy kwant wątek jest gotowy do uruchomienia, ale nie został uruchomiony przez program planujący.

Wydaje się, że wartość PR odpowiada dynamicznemu priorytetowi.

Zakres wartości NI wynosi -20..19 . Zatem wartość PR może mieć wartości od 0 (20-20) do 39 (20 + 19). Ale jest to poprawne tylko dla procesów z domyślną polityką planowania ( SHED_OTHER ). Mogą istnieć również procesy z tak zwanymi zasadami planowania w „czasie rzeczywistym” . Te zasady to SCHED_RR i SCHED_FIFO . Takie procesy mają wartość PR mniejszą niż 0. Możesz to sprawdzić, uruchamiając chrt -r 1 toppolecenie (musisz być rootem). Góry proces ma PR -2 . Możesz nawet uruchomić chrt -r 90 topw takim przypadku góręproces będzie miał PR -91 .

Wydaje się, że dla procesów SCHED_RR wartość PR można obliczyć ze wzoru:

PR = - 1 - schedule_rr_priority .

Zatem proces SCHED_RR ma przynajmniej PR -1, co oznacza, że ​​każdy proces SCHED_RR ma wyższy priorytet niż jakikolwiek SCHED_OTHER . Odpowiada to instrukcji pthread:

SCHED_FIFO może być używane tylko z priorytetami statycznymi wyższymi niż 0, co oznacza, że ​​gdy wątki SCHED_FIFO staną się uruchamialne, zawsze natychmiast zapobiegnie wszelkim działającym wątkom SCHED_OTHER, SCHED_BATCH lub SCHED_IDLE.

SCHED_RR to proste rozszerzenie SCHED_FIFO. Wszystko opisane powyżej dla SCHED_FIFO dotyczy również SCHED_RR,

Priorytet procesów w czasie rzeczywistym nazywany jest priorytetem statycznym, którego jądro nie może zmienić. Tak pozytywne PR wartości mogą być traktowane jako priorytet dynamiczny dla non-realtime ( SCHED_OTHER , SCHED_BATCH ) procesy i negatywnym PR wartości jako statyczny priorytet dla procesów w czasie rzeczywistym ( SCHED_RR , SCHED_FIFO ).

Próbowałem także uruchomić nice -n 10 chrt -r 50 top(i chrt -r 50 nice -n 10 top). Wartość NI wynosiła 10, ale PR nadal wynosił -51 . Wygląda więc na to, że wartość NI nie wpływa na priorytet procesów SCHED_RR . Odpowiada to instrukcji setpriority :

Wszelkie procesy lub wątki używające SCHED_FIFO lub SCHED_RR nie będą miały wpływu na wywołanie setpriority (). To nie jest uważane za błąd. Proces, który następnie powraca do SCHED_OTHER, nie musi mieć wpływu na priorytet takiego wywołania setpriority ().

Jedna zabawna notatka. Jeśli uruchomisz chrt -r 99 top, zobaczysz wartość RT zamiast liczby w kolumnie PR .

  PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND
28489 root RT 0 2852 1200 896 R 0 0,1 0: 00,01 góra

Nie sądzę, że oznacza to, że proces ten jest teraz wyjątkowy. Myślę, że to oznacza, że top po prostu nie drukuje -100, ponieważ wydruk wymagałby 4 znaków.

Możesz również użyć htop zamiast góry we wszystkich przykładach, które mogą być wygodniejsze. ps -lmoże być również użyty, ale punktem bazowym oddzielającym priorytety w czasie rzeczywistym i nie w czasie rzeczywistym nie jest 0, ale 60, więc nice -n -20 ps -lzostanie wydrukowany

FS UID PID PPID C PRI NI ADRES SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60-20 - 1176 - pkt / 6 00:00:00 ps
Anton
źródło
Co dziwne, jeśli uruchomię 5 nieskończonych pętli (int main {while (1);}) na 2 rdzeniach z hiperwątkowym i3, ich priorytety pozostaną stałe. To w testowaniu sid Debiana.
Vorac,
1
@BelminFernandez Myślę, że sprawiedliwe będzie uczynienie tej odpowiedzi „akceptowaną”.
z0lupka,
1

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. W przypadku normalnych (i tylko tych) nice stosuje się w następujący sposób:

Miły

Skala „łagodności” wynosi od -20 do 19, podczas gdy -20 to najwyższy priorytet, a 19 najniższy. 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 bitów. Użytkownik root może uruchamiać programy z określoną 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 (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

Warto zauważyć, że procesy o wartości PR -51 na przykład odpowiadają 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.

(PS: Umieściłbym zdjęcie pokazujące najlepszy wynik, ale nie mam na to reputacji)

Agustin Barrachina
źródło