Dydaktyka:
Feedback
Komenda sleep czas
śpi podany czas.
Domyślną jednostką czasu są sekundy (s
), ale można podać też m
, h
i d
.
sleep 1d
jest równoważne sleep 24h
i sleep 1440m
i sleep 86400[s]
.
Niektóre implementacje sleep rozumieją ułamki dziesiętne, np. sleep 0.05m
będzie spać 3s.
Komenda time polecenie [argumenty]...
uruchamiana podane polecenie z argumentami i mierzy czas jego wykonania.
Komenda timeout czas polecenie [argumenty]...
uruchamiana podane
polecenie i przerywa je po upłynięciu wskazanego czasu.
Zadanie 1 Wykonaj komendę która śpi przez 2 sekundy.
Zadanie 2 Zmierz ile czasu trwa wykonanie komendy z poprzedniego zadania.
Zadanie 3 Zmierz ile czasu trwa wykonanie komendy:
openssl dhparam -text 1536
dd if=/dev/zero of=/dev/null bs=1 count=2M
dd if=/dev/urandom of=/tmp/
plik bs=1M count=100
pzstd -10 /tmp/
plik
(użyj tutaj pliku z poprzedniego zadania)
Zadanie 4 Wykonaj komendę openssl dhparam -text 2048
z limitem czasu 5s.
user@host ~ $ sleep 5s # czeka 5 sekund user@host ~ $ time sleep 2s real 0m2,001s # czas rzeczywisty user 0m0,000s # czas użycia procesora w przestrzeni użytkownika sys 0m0,001s # czas użycia procesora w jądrze user@host ~ $ time /tmp/command real 0m0,703s user 0m1,099s # ┌ przy użyciu więcej niż jednego CPU naraz, sys 0m1,170s # └ te czasy mogą przekraczać czas rzeczywisty user@host ~ $ timeout 0.5s sleep 10m # po 0.5s sleep zostanie brutalnie przerwany user@host ~ $
Program jest sekwencją instrukcji1). Proces to uruchomienie (instancja) programu.
Na proces poza sekwencją instrukcji (załadowaną do pamięci operacyjnej) składa się wszystko co opisuje stan jego wykonania – np. zawartość rejestrów procesora, stan pamięci operacyjnej.
Uruchamiając ten sam program (tą samą aplikację) wielokrotnie tworzy się wiele procesów.
W uniksopodobnych systemach nowy proces może być uruchomiony tylko przez inny proces (poza pierwszym procesem, o identyfikatorze 1, zwanym init, uruchamianym przez jądro systemu operacyjnego przy starcie.
Określenie procesy potomne procesu x (child processes) opisuje procesy
uruchomione przez x.
Rodzic (parent process) procesu x to proces który uruchomił x.
Procesy są identyfikowane przez pid (process identifier).
Dla każdego procesu utrzymywany jest identyfikator rodzica – ppid (parent pid).
Kiedy kończy się proces potomny, system operacyjny utrzymuje proces do czasu aż
jego wartość wyjściowa zostanie zebrana (reap) przez rodzica.
Proces który się zakończył, ale jego wartość nie została zebrana przez rodzica,
nazywany jest zombie.
Rodzic procesu dostaje sygnał SIGCHLD kiedy coś się stanie z procesem potomnym, np. kiedy proces potomny się zakończy.
Jeśli proces a uruchomi b, proces b uruchomi c, to po zakończeniu b proces c staje się sierotą (orphan process) i jego rodzicem zostaje proces init.
Do wyświetlenia listy procesów i wątków w systemie można użyć komendy ps
.
Wybór użytecznych opcji dla ps
:
-e
wybiera wszystkie procesy w systemie-l|-f|-F
wybiera długi, pełny lub ekstra pełny format wyjścia-L|-T
pokazuje wątki-H
sortuje hierarchicznie i rysuje (wcięciami w polu komenda) dzieci
Program ps
posiada dwie składnie poleceń – jedną spójną z typową dla systemu
UNIX (powyższa), drugą pochodzącą z systemów BSD.
Powszechnie spotykane ps aux
to wywołanie ps
z opcjami zapisanymi w
stylu BSD pokazujące wszystkie procesy w systemie w konkretnym formacie.
Zadanie 5 Wyświetl listę procesów poleceniem ps
(bez argumentów).
Zadanie 6 Wyświetl listę procesów poleceniem ps
zmieniając format wyników (kolumny) tak żeby było więcej szczegółów.
Zadanie 7 Wyświetl listę wszystkich procesów w systemie.
Zadanie 8 Wyświetl listę wszystkich procesów i wątków w systemie. Znajdź na niej dwa wątki tego samego procesu.
Zadanie 9 Uruchom polecenie python -c 'import os; os.popen("true"); os.read(0,1)'
które "wyprodukuje" proces zombie. Znajdź go na liście procesów.
Lista procesów w formie drzewa może być wyświetlona komendą pstree
.
W pstree
przełącznik -p
dodaje pidy, -u
użytkownika, a a
pokazuje argumenty z jakimi został uruchomiony proces.
Zadanie 10 Wyświetl drzewo procesów.
Zadanie 11 Wyświetl drzewo procesów z pidem każdego procesu.
Przykłady - listowanie procesów
user@host ~ $ ps PID TTY TIME CMD 741 pts/5 00:00:00 ash 742 pts/5 00:00:00 ps user@host ~ $ ps -e PID TTY TIME CMD 1 ? 00:00:00 init 270 ? 00:00:00 syslogd 298 ? 00:00:00 crond 401 ? 00:00:00 udhcpc 444 pts/0 00:00:00 getty 445 pts/1 00:00:00 login 633 ? 00:00:00 sshd 659 pts/1 00:00:00 ash 697 pts/1 00:00:00 perl 723 pts/1 00:00:00 top 738 ? 00:00:00 sshd-session 740 ? 00:00:00 sshd-session 741 pts/5 00:00:00 ash 743 pts/5 00:00:00 ps user@host ~ $ ps -el F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 406 - ? 00:00:00 init 4 S 0 270 1 0 80 0 - 410 - ? 00:00:00 syslogd 0 S 0 298 1 0 80 0 - 406 - ? 00:00:00 crond 5 S 0 401 1 0 80 0 - 406 - ? 00:00:00 udhcpc 0 S 0 444 1 0 80 0 - 406 - pts/0 00:00:00 getty 0 S 0 445 1 0 80 0 - 406 - pts/1 00:00:00 login 5 S 0 633 1 0 80 0 - 1543 - ? 00:00:00 sshd 4 S 1000 659 445 0 80 0 - 427 do_wai pts/1 00:00:00 ash 0 S 1000 697 659 0 80 0 - 1605 futex_ pts/1 00:00:00 perl 0 S 1000 723 659 0 80 0 - 927 do_sel pts/1 00:00:00 top 4 S 0 738 633 0 80 0 - 1659 - ? 00:00:00 sshd-session 5 S 1000 740 738 0 80 0 - 1734 - ? 00:00:00 sshd-session 0 S 1000 741 740 0 80 0 - 427 do_wai pts/5 00:00:00 ash 0 R 1000 744 741 0 80 0 - 639 - pts/5 00:00:00 ps user@host ~ $ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 21:13 ? 00:00:00 /sbin/init root 270 1 0 21:13 ? 00:00:00 /sbin/syslogd -t -n root 298 1 0 21:13 ? 00:00:00 /usr/sbin/crond -c /etc/crontabs -f root 401 1 0 21:13 ? 00:00:00 /sbin/udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:temp root 444 1 0 21:13 pts/0 00:00:00 /sbin/getty 38400 console root 445 1 0 21:13 pts/1 00:00:00 /bin/login -- user root 633 1 0 21:17 ? 00:00:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups user 659 445 0 21:19 pts/1 00:00:00 -ash user 697 659 0 21:32 pts/1 00:00:00 perl ./myScript.pl user 723 659 0 21:36 pts/1 00:00:00 top root 738 633 0 21:38 ? 00:00:00 sshd-session: user [priv] user 740 738 0 21:39 ? 00:00:00 sshd-session: user@pts/5 user 741 740 0 21:39 pts/5 00:00:00 -ash user 745 741 0 21:39 pts/5 00:00:00 ps -ef user@host ~ $ ps -Tef UID PID SPID PPID C STIME TTY TIME CMD root 1 1 0 0 21:13 ? 00:00:00 /sbin/init root 270 270 1 0 21:13 ? 00:00:00 /sbin/syslogd -t -n root 298 298 1 0 21:13 ? 00:00:00 /usr/sbin/crond -c /etc/crontabs -f root 401 401 1 0 21:13 ? 00:00:00 /sbin/udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:temp root 444 444 1 0 21:13 pts/0 00:00:00 /sbin/getty 38400 console root 445 445 1 0 21:13 pts/1 00:00:00 /bin/login -- user root 633 633 1 0 21:17 ? 00:00:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups user 659 659 445 0 21:19 pts/1 00:00:00 -ash user 697 697 659 0 21:32 pts/1 00:00:00 perl ./myScript.pl user 697 698 659 0 21:32 pts/1 00:00:00 perl ./myScript.pl user 723 723 659 0 21:36 pts/1 00:00:00 top root 738 738 633 0 21:38 ? 00:00:00 sshd-session: user [priv] user 740 740 738 0 21:39 ? 00:00:00 sshd-session: user@pts/5 user 741 741 740 0 21:39 pts/5 00:00:00 -ash user 746 746 741 0 21:39 pts/5 00:00:00 ps -Tef user@host ~ $ ps -Hef UID PID PPID C STIME TTY TIME CMD root 1 0 0 21:13 ? 00:00:00 /sbin/init root 270 1 0 21:13 ? 00:00:00 /sbin/syslogd -t -n root 298 1 0 21:13 ? 00:00:00 /usr/sbin/crond -c /etc/crontabs -f root 401 1 0 21:13 ? 00:00:00 /sbin/udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:temp root 444 1 0 21:13 pts/0 00:00:00 /sbin/getty 38400 console root 445 1 0 21:13 pts/1 00:00:00 /bin/login -- user user 659 445 0 21:19 pts/1 00:00:00 -ash user 697 659 0 21:32 pts/1 00:00:00 perl ./myScript.pl user 723 659 0 21:36 pts/1 00:00:00 top root 633 1 0 21:17 ? 00:00:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups root 738 633 0 21:38 ? 00:00:00 sshd-session: user [priv] user 740 738 0 21:39 ? 00:00:00 sshd-session: user@pts/5 user 741 740 0 21:39 pts/5 00:00:00 -ash user 747 741 0 21:39 pts/5 00:00:00 ps -Hef user@host ~ $ pstree init─┬─crond ├─getty ├─login───ash─┬─perl───{perl} │ └─top ├─sshd───sshd-session───sshd-session───ash───pstree ├─syslogd └─udhcpc user@host ~ $ pstree -hup init(1)─┬─crond(298) ├─getty(444) ├─login(445)───ash(659,user)─┬─perl(697)───{perl}(698) │ └─top(723) ├─sshd(633)───sshd-session(738)───sshd-session(740,user)───ash(741)───pstree(750) ├─syslogd(270) └─udhcpc(401) user@host ~ $ pstree -a init ├─crond -c /etc/crontabs -f ├─getty 38400 console ├─login -- user │ └─ash │ ├─perl ./myScript.pl │ │ └─{perl} │ └─top ├─sshd │ └─sshd-session │ └─sshd-session │ └─ash │ └─pstree -a ├─syslogd -t -n └─udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:temp
user@host ~ $ ps -t tty1 PID TTY TIME CMD 445 pts/1 00:00:00 login 659 pts/1 00:00:00 ash 798 pts/1 00:00:00 perl 799 pts/1 00:00:00 fortune user@host ~ $ ps -l -t tty1 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 0 445 1 0 80 0 - 406 - pts/1 00:00:00 login 4 S 1000 659 445 0 80 0 - 427 do_wai pts/1 00:00:00 ash 0 S 1000 798 659 0 80 0 - 1244 hrtime pts/1 00:00:00 perl 0 Z 1000 799 798 0 80 0 - 0 - pts/1 00:00:00 fortune user@host ~ $ ps -f -t tty1 UID PID PPID C STIME TTY TIME CMD root 445 1 0 21:13 pts/1 00:00:00 /bin/login -- user user 659 445 0 21:19 pts/1 00:00:00 -ash user 798 659 0 21:49 pts/1 00:00:00 perl -e open(my $fh, "fortune -s|"); sleep 60*60; user 799 798 0 21:49 pts/1 00:00:00 [fortune] <defunct> user@host ~ $ ps -F -t tty1 UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 445 1 0 406 800 4 21:13 pts/1 00:00:00 /bin/login -- user user 659 445 0 427 1120 15 21:19 pts/1 00:00:00 -ash user 798 659 0 1244 2880 6 21:49 pts/1 00:00:00 perl -e open(my $fh, "fortune -s|"); sleep 60*60; user 799 798 0 0 0 17 21:49 pts/1 00:00:00 [fortune] <defunct> user@host ~ $ ps ut tty1 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 445 0.0 0.0 1624 800 pts/1 Ss 21:13 0:00 /bin/login -- user user 659 0.0 0.0 1708 1120 pts/1 S 21:19 0:00 -ash user 798 0.0 0.0 4976 2880 pts/1 S+ 21:49 0:00 perl -e open(my $fh, "fortune -s|"); sleep 60*60; user 799 0.0 0.0 0 0 pts/1 Z+ 21:49 0:00 [fortune] <defunct> user@host ~ $ pstree -a 659 ash └─perl -e open(my $fh, "fortune -s|"); sleep 60*60; └─(fortune)
Pseudo system plików procfs
, zamontowany standardowo w /proc
, pozwala
odczytać informacje o procesach przez dostęp do plików.
Katalog /proc/self
zawiera szczegółowe informacje o procesie który próbuje
je przeczytać.
W man 5 proc
znajdziesz szczegółowe informacje.
Zadanie 12 Wyświetl zawartość pliku /proc/self/status
. Informacje o jakim procesie zostały wyświetlone?
Zadanie 13 Doczytaj w podręczniku i sprawdź co jeszcze jest w katalogach /proc/pid/
.
Określenie zużycia pamięci przez proces jest trudne.
System wie jakie zakresy pamięci są dostępne dla procesu, więc można określić
ile bajtów zajmuje pamięć wirtualna procesu (virtual set size).
Ale system operacyjny nie ładuje wszystkiego czego proces zażądał od razu do
pamięci (część danych jest ładowana dopiero przy próbie dostępu do nich).
System wie za to do czego proces ma w tej chwili dostęp w RAMie
(resident set size).
Ale to nie wlicza swapa, a i bez tego jeżeli jakiś plik jest współdzielony przez
wiele procesów (np. biblioteka do rysowania okienek), to suma RSSów nie będzie
równa zajętości pamięci.
Mając odpowiednie uprawnienia, można w Linuksie określić do jakiej pamięci ma
dostęp tylko ten proces (unique set size), a rozmiary współdzielonych plików
można proporcjonalnie doliczyć do tej pamięci dostając w miarę rozsądną metrykę
zajętości pamięci (proportional set size).
Ale co z swapem i kompresją wewnątrz RAMu…
Zużycie pamięci próbuje sensownie pokazać program smem
; sprawdź opcje -p
i -t -k
.
Komenda top
jest dostępnym w wielu systemach narzędziem pokazującym na
bieżąco listę procesów i podstawowe informacje o obciążeniu systemu.
Zadanie 14 Uruchom top
. Naciśnij h
żeby dostać się do pomocy.
Zmień kolumnę po której są sortowane dane.
Zadanie 15 Co oznaczają stany procesu R
, S
, D
, t
i Z
?
Sprawdź w man ps
.
Program htop
został stworzony jako wygodny i bardziej
funkcjonalny top
.
Podstawowe skróty w htop są w pasku menu na dole; h
pokazuje pomoc,
t
przełącza między trybem drzewa i zwykłą listą, <
i >
sortują
procesy, k
wysyła sygnał do procesu, a
ustawia na których procesorach
może działać program (affinity), i
ustawia priorytet dostępu do dysku,
/
szuka, a \
filtruje po nazwie, u
filtruje po użytkowniku, space
zaznacza procesy, tab przełącza między użyciem procesora i pamięci
a użyciem dysku.
htop
pozwala używać myszy do nawigacji i pozwala łatwo konfigurować zarówno
pasek górny jak i wygląd listy procesów.
Zadanie 16 W programie htop
zmień kolumnę sortowania.
Zadanie 17 W programie htop
ustaw tryb drzewa i znajdź program htop
w liście procesów.
Poza programem htop
, istnieje wiele narzędzi wzorowanych na top
pokazujących
stan systemu i procesów. Są to m. in.. iotop
(użycie I/O), atop
, glances
, bottom
.
Programy pgrep
i pidof
pozwalają wyszukiwać pid
procesu na podstawie podanych kryteriów.
Domyślnie pgrep regex
dopasowuje regex do nazwy programu.
Z -f
szuka po pełnej linii poleceń (nazwa programu z argumentami).
Inne opcje pozwalają wyszukać procesów potomnych podanego procesu czy procesów
wybranego użytkownika.
Program pidof nazwa
wyświetli pidy procesów których nazwa
(przycięta do 15 znaków) jest identyczna z podaną.
Zadanie 18 Uruchom program sleep 1h
. W innym terminalu znajdź jego pid.
Zadanie 19 W jednym terminalu uruchom program sleep 1337h
, w drugim sleep 42h
. Znajdź pid tego pierwszego.
Zadanie 20 Znajdź pid procesu gdm
wiedząc, że na twoim komputerze są też inne procesu mające na początku nazwy ciąg liter gdm
.
Sygnały są dla procesów odpowiednikiem przerwań.
Posiadając odpowiednie uprawnienia można wysłać sygnał do procesu – tzn. zażądać
od systemu operacyjnego, wykonując wywołanie systemowe kill
, dostarczenia
sygnału do procesu.
System operacyjny dodaje każdy wysłany sygnał do listy oczekujących sygnałów
i jeśli tylko może, to dostarcza go.
Dla większości sygnałów programista może ustawić czy dany sygnał ma być
dostarczany do programu i która (napisana przez programistę) funkcja ma być
wywołana kiedy sygnał zostanie dostarczony.
Dostarczenie sygnału przez system operacyjny polega, podobnie jak przy wywołaniu
funkcji, na zapisaniu stanu jednego z wątków, przygotowaniu na stosie informacji
o sygnale i ustawienie licznika rozkazów na funkcję którą programista wskazał
do obsługi sygnału.
Sygnał może być dostarczony w dowolnie niewygodnym momencie
Sygnały rozróżnia się po numerach i odpowiadających im nazwach (man 7 signal
).
Często jako skrót "sygnał X" zapisuje się jako SIGX, np. sygnał TERM to SIGTERM.
Sygnały są zwykle używane do informowania procesu o błędach, zewnętrznych
zdarzeniach lub do komunikacji między procesami.
Przykłady sygnałów:
nohup komenda argumenty...
spowoduje zignorowanie tego sygnału przez uruchomiony proces.
Do wysłania sygnału służy komenda kill [-sygnał] pid
.
Jeśli nie określono który sygnał wysłać, kill
wyśle TERM.
Sygnał można zapisać jako jego numer, np. kill -3 pid
lub nazwę, np. kill -INT pid
Nazwy i numery sygnałów można sprawdzić komendą kill -l
lub kill -L
.
Komenda kill
przyjmuje tylko pid – numeryczny identyfikator procesu.
Podanie ujemnej wartości pid ma konkretne znaczenie; więcej w man kill
Zadanie 21 W jednym terminalu uruchom sleep 1h
. Z innego terminala zabij ten proces używając kill
.
Komenda pkill
działa identycznie jak pgrep
, tylko zamiast wyświetlać
identyfikatory, wysyła wskazany (identycznie jak w komendzie kill
) sygnał do
pasujących procesów.
Komenda killall nazwa
domyślnie wyśle sygnał do wszystkich procesów
których nazwa (przycięta do 15 znaków) jest identyczna z podaną.
Opcjami można m. inn. dopasować się do wyrażeń regularnych i pełnej nazwy.
Zadanie 22 W jednym terminalu uruchom sleep 1h
. Z innego terminala zabij ten proces używając pkill
.
Zadanie 23 Powtórz poprzednie zadanie zmieniając sygnał kolejno na INT, QUIT i KILL.
Zadanie 24 Uruchom program mousepad
lub glxgears
. Wyślij do niego sygnał STOP. Sprawdź jak działa mousepad. Potem wyślij do niego sygnał CONT.
Zadanie 25 Uruchom w jednym terminalu komendą /usr/sbin/named -g -c <(:)
serwer DNS. Z drugiego terminalu wyślij sygnał HUP do named
a.
W powłoce może działać jeden proces pierwszoplanowy (foreground) i wiele procesów w tle (background).
Aby uruchomić proces w tle, należy użyć składni komenda &
.
Procesy działające w tle wciąż mogą pisać do terminala, ale domyślnie zostaną
zatrzymane na próbie czytania z terminala.
Zwykle skrót Ctrl+z jest domyślnie skonfigurowany do wysłania sygnału STOP do bieżącego procesu.
Listę zatrzymanych i działających w tle procesów powłoki (tzw. tablicę zadań)
można wyświetlić używając komendy jobs
.
Zatrzymany proces z tablicy zadań można kontynuować na pierwszym planie używając
komendy fg [spec]
lub kontynuować w tle używając komendy bg [spec]
.
Działający proces z tablicy zadań można przełączyć na pierwszy plan komendą fg [spec]
.
Specyfikacja procesu w fg
i bg
może być jego numerem w tablicy zadań
poprzedzonym znakiem %
, znakiem %+
lub %-
oznaczającym ostatnie i przedostatnie
zadanie2),
bądź jednoznacznym początkiem nazwy procesu poprzedzonym %
.
Bez argumentu fg
i bg
zadziała na ostatnie zadanie.
Polecenie kill
powinno też akceptować jako określenie procesu
argumenty takie jak dla fg
i bg
. Takie zachowanie jest wymagane przez POSIX.
Na zakończenie działających w tle zadań można oczekiwać używając polecenia wait [spec]
z argumentami jak dla fg
/bg
.
Bez podania argumentów wait
czeka na zakończenie wszystkich zadań.
Część powłok pozwala na pominięcie znaku %
w argumentach fg
i bg
.
Zadanie 26 Uruchom ping -i5 put.poznan.pl
w tle. Wyświetl listę zadań. Przenieś ten proces na pierwszy plan.
Zadanie 27 Uruchom ping -i5 put.poznan.pl
, następnie zatrzymaj go przez Ctrl+z.
Potem uruchom sleep 1h
i też zatrzymaj go przez Ctrl+z. Wyświetl listę zadań.
Następnie kontynuuj w tle proces ping
. Potem zabij go i zatrzymany proces sleep
.
Zadanie 28 Uruchom w tle sleep 1h
oraz sleep 15s
. Poczekaj poleceniem wait
na zakończenie drugiego sleep
a.
Przydziałem dostępu do zasobów komputera dla programu zajmuje się system operacyjny. Użytkownik (administrator) może wpływać na to jakie decyzje podejmują planiści ([1], [2]).
Procesy w uniksopodobnych systemach mają niceness,
które decyduje o priorytecie przydzielania CPU.
Niceness jest ustawialne w zakresie od -20 (najwyższy priorytet) do 19 (najniższy) i dziedziczone od rodzica.
Init startuje procesy z niceness 0.
Podnieść niceness może każdy, obniżyć – tylko root.
Wykonując komendę nice [-n <N>] komenda [argument]...
można uruchomić proces z podanym niceness.
Można też zmienić niceness działającego procesu komendą renice [-n]<N> pid
.
Część dystrybucji Linuksa włącza autogroup
które umieszcza automatycznie
procesy w osobnych grupach (więcej w man 7 sched
). Niceness liczy się
tylko między procesami wewnątrz grupy. sysctl -ar sched_autogroup_enabled
sprawdza czy ta funkcjonalność jest włączona.
Można też wybrać na których fizycznych wątkach procesora będzie się wykonywać
proces programem taskset
.
Komenda taskset 0x03 komenda [argument]...
i
taskset -c 0,1 komenda [argument]...
uruchomi proces tylko na
rdzeniach 0 i 1.
Komenda taskset -p [-c] pid
wyświetli dozwolone fizyczne wątki dla podanego
pid, a taskset -p [-c] spec pid
je zmieni na spec.
htop
pozwala zmieniać niceness (skróty F7/
F8) i wybrać procesory
dla procesu (skrót a od affinity).
Zadanie 29 Uruchom komendę sleep 1h
z niceness 10. Sprawdź jej nicneness (np. w ps
/ htop
).
Zadanie 30 Uruchom komendę sleep 1h
i potem zmień jej niceness na 15.
Zadanie 31 W dwóch konsolach wykonaj taskset -pc 0 $$
(która zmieni listę dozwolonych procesorów tego shella na pierwszy).
Następnie w jednym wykonaj openssl dhparam 9000
, w drugim openssl dhparam 9001
(co uruchomi procesorożerne szukanie dużych liczb pierwszych).
W trzeciej konsoli uruchom htop
i obserwuj zużycie CPU.
Zmieniaj stopniowo niceness jednego z tych procesów. Jak zmienia się użycie CPU przez te procesy?
Priorytet dostępu do I/O (dysków) można ustawiać / zmieniać komendą ionice
.
Są dostępne "trzy" klasy: 1 (realtime), 2 (best-effort) i 3 (idle) oraz 0 (brak
klasy). Klasy 1 i 2 dzielą się na 8 priorytetów (od najwyższego 0 do
najniższego 7).
Argumenty [-c nr_klasy] [-n priorytet]
wybierają klasę i priorytet.
Podobnie jak taskset
, można uruchomić polecenie z podaną klasą, bądź z
przełącznikiem -p
wyświetlić / zmienić ustawienia dla podanego pid.
htop
pozwala zmieniać klasy I/O (skrót i).
Sprzęt w których zasoby (głównie pamięć) mają różny koszt dostępu z różnych
procesorów (NUMA)
jest przez system dzielony na węzły wewnątrz których dostęp ma równy koszt, ale
między którymi koszt dostępu jest większy.
Przykład – na płycie głównej z dwoma gniazdami na procesory pamięć DRAM podłączona
do procesora na którym działa proces ma niższy koszt dostępu niż pamięć RAM
podłączona do procesora w drugim gnieździe.
Polecenie numactl
pozwala kontrolować jak mają być uruchamiane procesy
w takich systemach.
numactl -H
pokazuje listę węzłów, a
numactl -N x -m y komenda [argumenty]...
uruchamia komendę
na procesorach z węzła x i pamięci z węzła y.
Komenda lstopo
z paczki hwloc
pozwala zwizualizować topologię zasobów maszyny.