17. Linux: monitorování systému, procesy, příkaz ps, adresář /proc, obsah adresáře /var.
17. Linux: monitorování systému, procesy, příkaz ps, adresář /proc, obsah adresáře /var.
Proces je spuštěný program.
Každý proces má přiřazeno jednoznačné číslo - PID
Každý proces má svého rodiče a zná ho pod číslem procesu - PPID
Proces vzniká voláním systémových služeb fork resp. exec
Vlákno (Thread) je spuštěný podprogram v rámci procesu nebo jádra.
Programování pomocí vláken vyžaduje synchronizaci přístupu k datům.
Proces tvořený více vlákny může být vykonáván na více procesorech (klasický jednovláknový proces může být vykonáván vždy jen na jednom procesoru).
Vlákna v rámci procesu jsou zvenku procesu neviditelná.
Vytvoření nového vlákna v rámci procesu je daleko rychlejší než vytvoření nového procesu.
Pro jednoduchost se vlákny nebudeme nadále zabývat.
Obsazená paměť
Pro zjištění kolik paměti který proces právě využívá nám poslouží příkaz ps s klíčovými slovy vsize a rss. První z nich zajistí výpis toho, kolik virtuální paměti právě ten který proces využívá — tento údaj přesně odpovídá spotřebě paměti v nevirtuálním systému typu Mac OS 9. Druhý údaj, rss, ukazuje, kolik je v současnosti aplikaci přiděleno reálné paměti. Oba dva údaje jsou v kilobytech:
2 ~> ps -o pid,ucomm,vsize,rss
PID UCOMM VSZ RSS
421 zsh 2136 160
429 telnet 14496 388
422 zsh 2136 160
1509 zsh 2136 540
7793 zsh 2136 796
3 ~>
Stojí za to si všimnout, že velikost virtuální paměti je větší — někdy mnohem větší — než reálné. To nemusí nutně souviset jen s tím, že správce paměti může procesu stránky odebrat; je to také tím, že pokud proces alokuje nějakou paměť, ale dosud ji nepoužije, odpovídající stránky není třeba přidělovat.
Ukažme si to na příkladu triviálního programu, který alokuje paměť po stovkách megabytů, ale nijak ji nevyužívá: zdrojový kód je tak jednoduchý, že by jej měli bez obtíží pochopit i neprogramátoři.
98 /tmp> >t.m
#include <stdlib.h>
int main() {
while (1) {
if (!malloc(100*1024*1024)) break;
usleep(100000);
}
return 0;
}
99 /tmp> cc t.m && ( ./a.out & while (true) ; do ( ps -o ucomm,vsize,rss | fgrep a.out ) ; sleep 1 ; done )
a.out 1025548 296
a.out 2049548 296
a.out 3073548 296
*** malloc: vm_allocate(size=104857600) failed with 3
*** malloc[12163]: error: Can't allocate region
^C
100 /tmp>
Vidíme, že program běžel bez problémů (a, mimochodem, bez nejmenšího omezujícího vlivu na zbytek operačního systému) dokud neskončil na tom, že pro funkci malloc už nebyl k dispozici adresový prostor — nikoli paměť, ale volné adresy. Skutečné paměti aplikace potřebovala pořád stejně — nějakých 300 KB.
To proto, že se ve skutečnosti vlastně žádná paměť nealokovala: k tomu by došlo teprve tehdy, až by se program pokusil "naalokovanou" paměť použít. Hle, další výhoda virtuální paměti!
Souborový systém /proc
Systém souborů /proc je vlastně imaginárním Souborovým systémem. Ve skutečnosti na disku neexistuje. Místo toho jej v paměti vytváří jádro systému. Ze systému souborů /proc lze získávat různé aktuální informace o systému (původně o procesech - z toho je odvozeno jeho jméno). Některé z významnějších souborů a adresářů popisujeme níže. Samotný souborový systém /proc je podrobněji popsán na manuálové stránce proc.
/proc/1 | Adresář s informací o procesu číslo 1. Každý z procesů má v adresáři /proc vlastní podadresář, kterého jméno je stejné, jako identifikační číslo procesu. |
/proc/cpuinfo | Různé informace o procesoru. Například typ, výrobce model, atd. |
/proc/devices | Seznam ovladačů zařízení konfigurovaných pro aktuálně běžící jádro systému. |
/proc/dma | Informuje o tom, které kanály DMA jsou právě využívány. |
/proc/filesystems | Souborové systémy konfigurované v jádru systému. |
/proc/interrupts | Informuje o tom, která přerušení jsou využívána, i o historii žádostí o využití každého z nich. |
/proc/ioports | Informuje o tom, který z vstupně-výstupních portů se momentálně využívá. |
/proc/kcore | Obraz fyzické paměti systému. Má velikost odpovídající velikosti fyzické paměti systému. Ve skutečnosti ale samozřejmě nezabírá takovéto množství paměti, protože jde o soubor generovaný "na požádání", tedy pokaždé jenom v okamžiku, kdy k němu různé programy přistupují. Uvědomte si, že soubory souborového systému /proc nezabírají ve skutečnosti (než je zkopírujete na nějaké jiné místo na disku) vůbec žádný diskový prostor. |
/proc/kmsg | Výstupní hlášení jádra systému. Zde uložená hlášení využívá i program syslog. |
/proc/ksyms | Tabulka symbolů jádra systému. |
/proc/loadavg | Statistika zatížení systému - tři celkem nic neříkající indikátory toho, kolik práce systém momentálně má. |
/proc/meminfo | Informace o využití paměti, jak fyzické, tak virtuální (swap). |
/proc/modules | Informuje o tom, které moduly jádra jsou právě zavedeny v paměti. |
/proc/net | Informace o stavu síťových protokolů. |
/proc/self | Symbolický link do adresáře procesů toho programu, který zrovna přistupuje k souborovému systému /proc. Když k systému souborů /proc současně přistupují dva různé procesy, budou mít přidělené dva různé linky. Tímto způsobem se mohou programy pohodlně a jednoduše dostat k vlastnímu adresáři. |
/proc/stat | Různé statistiky týkající se systému. Např. počet chyb stránkování během zavádění systému a podobné. |
/proc/uptime | Informuje o tom, jak dlouho systém běží. |
/proc/version | Verze jádra systému. |
Většina výše popsaných souborů má textovou formu. Jsou tedy celkem dobře čitelné pomocí standardních nástrojů. Avšak velmi často jsou formátované takovým způsobem, že informace v nich obsažené jsou pro běžného uživatele na pohled dost těžce "stravitelné". Proto existuje mnoho příkazů, které - kromě toho, že čtou informace obsažené v souborech systému /proc, upravují jejich formát do srozumitelnější podoby. Tak například program free čte data ze souboru /proc/meminfo, převádí velikost v bajtech na kilobajty a přidá něco málo dalších informací o využití pamět.
Souborový systém /var
Systém /var obsahuje data, která se při běžném provozu systému mění. Soubory jsou specifické pro každý systém, a proto se data mezi jinými počítači v síti nesdílí.
/var/catman | Vyrovnávací paměť pro manuálové stránky, které jsou formátované na požádání. Zdroje pro tyto manuálové stránky jsou obvykle uložené v adresáři /usr/man/man*. Manuálové stránky v předem formátované verzi jsou uložené v adresáři /usr/man/cat*. Manuálové stránky je běžně třeba při prvním prohlížení formátovat. Formátované verze jsou pak uložené právě v adresáři /var/catman. Další uživatel, který si chce stejné stránky prohlížet, tak nemusí čekat na jejich opakované formátování. (Soubory v uvedeném adresáři /var/catman je obvykle potřeba mazat, stejně jako dočasné soubory v adresářích /tmp a /var/tmp.) /var/lib Soubory, které se při normálním provozu systému mění. /var/local Měnící se data pro programy instalované v adresáři /usr/local (tj. programy instalované správcem systému). Upozorňujeme, že lokálně instalované programy by měly používat i ostatní podadresáře nadřazeného adresáře /var, např. /var/lock. |
/var/lock | Soubory tzv. zámků. Většina programů dodržuje určitou konvenci a vytváří v adresáři /var/lock zámky. Tím dávají ostatním programům najevo, že dočasně využívají některé zařízení nebo soubor. Jiné programy, které by chtěly stejné zařízení či soubor ve stejném okamžiku používat, se o to nebudou pokoušet. |
/var/log | Adresář obsahuje tzv. log-soubory různých programů. Například program login zaznamenává (do souboru /var/log/wtmp) všechna přihlášení a odhlášení uživatelů systému, program syslog ukládá (do souboru /var/log/messages) všechny hlášky jádra systému a systémových programů. Velikost souborů v adresáři /var/log dost často nekontrolovaně roste. Proto se musí v pravidelných intervalech mazat. |
/var/run | Adresář, do něhož se ukládají soubory obsahující informace o systému, jež platí až do jeho dalšího zavedení. Tak například soubor /var/run/utmp obsahuje informace o současně přihlášených uživatelích systému. /var/spool Adresáře pro elektronickou poštu, systém "news", tiskové fronty a další subsystémy, které využívají metodu "spool" a princip řazení úloh do fronty. Každý z těchto subsystémů má v tomto adresáři svůj vlastní podadresář, např. poštovní schránky uživatelů jsou uložené v podadresáři /var/spool/mail. |
/var/tmp | Do adresáře /var/tmp se ukládají velké dočasné soubory a dočasné soubory, které budou existovat déle než ty, které se ukládají do adresáře /tmp. (Avšak správce systému by měl dbát na to, aby stejně jako v adresáři /tmp, ani v adresáři /var/tmp nebyly uloženy velmi staré dočasné soubory.) |