Dnes naposled se můžete podívat na výpis celého adresáře /proc. Po dnešku už budou všechny soubory otečkovány, a tak nebude mít smysl je vypisovat stále dokola:
.840 .devices .kcore .modules stat ide/ acpi/ .842 .dma .kmsg .mounts swaps irq/ .847 .execdomains .ksyms .mtrr .uptime net/ .848 .filesystems .loadavg .partitions .version nv/ .849 .interrupts .locks .pci bus/ sys/ .cmdline .iomem .meminfo .self@ driver/ sysvipc/ .cpuinfo .ioports .misc .slabinfo fs/ tty/
- stat
-
Soubor stat je jednou ze statistik, které jádro nabízí. Naleznete zde informace o celém systému, určené hlavně pro zběžnou kontrolu jeho stavu:
cpu 937 0 617 51832 cpu0 937 0 617 51832 page 56065 6655 swap 1 517 intr 118148 53386 3092 0 0 0 0 2 0 0 50074 0 0 6460 0 5134 0 .... disk_io: (3,0):(5136,3530,112131,1606,13310) ctxt 104742 btime 1000281282 processes 735
První dvě položky informují o stavu procesoru. Na jednoprocesorové mašině jsou identické, jinak první udává součet pro celý systém a následují jednotlivé procesory. Jednotlivé položky u procesorů znamenají (v tomto pořadí) časy procesoru strávené v režimu: user, nice, system, idle. To znamená, že můj procesor v době výpisu použil 937 jiffies pro běh uživatelského režimu, 617 pro běh v režimu jádra (systémovém) a 51832 jiffies promrhal nicneděláním. 0 na druhém místě říká, že zatím neběžel žádný program, který má prioritu sníženou pomocí volání nice(). Na druhou stranu, pokud si vzpomínáte na povídání o procesu jádra pro obsluhu „softwarových“ přerušení (ksoftirqd_CPU00) v dílu číslo 10 (o výpočtu loadavg), víte, že právě tento proces má nice rovnu 19. (Ano, skutečně nejmenší možná priorita).
Nejprve slíbené zdůvodnění, jak je možné, že tak důležitý proces má tak malou prioritu. Respektive neřeknu vám, proč má tak malou prioritu, když obsluhuje (kromě jiného) časovač, a ten potřebuje stejně pravidelně vykonávat, co je třeba. Možná odpověď je, že když je tento proces potřeba, zajistí se jeho probuzení jinými prostředky než standardním plánovačem, a bylo by tedy zbytečné, aby ho plánovač sám od sebe spouštěl. A jak to tedy funguje a jaké jsou ty jiné prostředky? Pokud je vyvoláno softwarové přerušení, existují dvě možnosti. Pokud jsme zrovna v té době v obsluze přerušení nebo ve funkci dolní poloviny handleru přerušení, je náš požadavek proveden po návratu z nich. Pokud tomu tak není, je vyvolána funkce wakeup_softirqd, která se pokusí probudit démona ksoftirqd. To provede funkce wake_up_proces(). Ta nakonec probublá do funkce, kde se požadovaná úloha zařadí na začátek fronty úloh připravených ke spuštění. Je možné požadovat okamžité přeplánování (parametr synchronous – jako v tomto případě), kdy se prostě zavolá plánovač ihned, nebo nechat dokončit aktuálně běžící úlohu a naši vybrat až při regulérním přeplánování (z důvodů vypršení časového kvanta).
Tak a teď budeme pokračovat naším výpisem. Další položkou je page. Dvě čísla znamenají počet stránek načtených a zapsaných na disk. Ne pro swap, ale například pro soubory mapované do paměti a vůbec všechny datové stránky. Podobně swap udává nejprve počet paměťových stránek přečtených ze swapu a další položka je počet stránek zapsaných na swap. Opakovaná operace se stejnou stránkou (čtení) nebo opakovaný zápis jsou počítány zvlášť.
Následuje blok informací o přerušeních. První číslo je počet všech obsloužených přerušení, za ním následuje statistika pro každé přerušení zvlášť (lze srovnat s informacemi v souboru interrupts).
Další na řadě je položka s informacemi o diskových operacích. Pro každé diskové zařízení (ne oddíl, ale celý disk) je zde informace v tomto formátu: (MAJOR, MINOR):(IO_OPERACE, READ_OPERACE, READ_BLOCK, WRITE_OPERACE, WRITE_BLOCK). MAJOR a MINOR jsou hlavní a vedlejší číslo disku. Následuje celkový počet požadavků na zařízení, počet požadavků na čtení, počet přečtených bloků, počet požadavků na zápis a počet zapsaných bloků (v jednom požadavku se často zapisuje několik bloků).
Poslední tři položky jsou již jednoduché. ctxt udává počet přepnutí kontextu od startu systému. Přepnutí kontextu je (zjednodušeně) změna prováděného procesu. Jeden proces se z procesoru odstraní a nahradí se jiným, který může procesor po jistou dobu používat (tato doba je právě ono časové kvantum). btime je čas nastartování systému a je uveden v počtu vteřin od 1.ledna 1970. Poslední položka udává počet provedení operace fork(), tedy počet vytvořených procesů. Vzhledem k tomu, že po operaci fork (respektive funkci do_fork() v jádře) nemusí vzniknout proces s novým PID, neodpovídá toto číslo poslednímu použitému PID. (Pomocí příznaku CLONE_PID lze vytvořit dva procesy se stejným PID – překvápko :-)
- swaps
-
Tak a poslední soubor. Tento nám říká, jak jsou v systému nakonfigurovány odkládací prostory:
Filename Type Size Used Priority /dev/hda4 partition 130748 26320 -1 /home/swap.64MB file 65528 0 -2
Nejprve je uvedeno jméno odkládacího prostoru. Tím může být buď disková oblast, nebo normální soubor na libovolném souborovém systému. Typ udává právě druhá položka. Pak tu máme celkovou velikost a využité místo. Priorita je určena k tomu, aby bylo možno odlišit jednotlivé oblasti (pokud jich je víc) dle jejich výkonu. Například odkládací prostor na samostatném (a rychlém) disku bude mít nejlepší prioritu, oddíl na stejném disku jako systém bude mít menší prioritu a swap v souboru bude mít nejmenší prioritu. Potom bude swapovací algoritmus používat nejprve swap na samostatném disku, pak na diskovém oddílu a teprve nakonec, když už jinde nebude místo, začne používat soubor. POZOR: Platí, že lepší je ten, kdo má vyšší číslo. Pro nastavení se používá příkaz swapon -p priorita swap :
swapoff /home/swap.64MB swapon -p 1 /home/swap.64MB
/dev/hda4 partition 130748 33564 -1 /home/swap.64MB file 65528 168 1
Pro zvýšení výkonu nemá význam mít více odkládacích oblastí na jednom zařízení, to lze doporučit jen pro případ, že krátkodobě potřebujete více dostupné paměti (nebo chcete někomu ukázat, jak vypadá výpis souboru /proc/swaps :). Na druhou stranu umístění (primárního) swapovacího oddílu na jiný disk (v lepším případě rychlejší) je vždy přínosem (lepší paralelismus).