Hlavní navigace

Co před námi tají /proc (18)

Tomáš Kašpárek

Dneska dokončíme poslední ze souborů v základním adresáři. Konkrétně se jedná o soubory "stat" a "swaps". Potom se zaměřím na úplné vymýcení všech bacilů, které se na mě poslední dobou nějak domluvily, a po malé přestávce na zotavenou budeme pokračovat v jednotlivých adresářích.

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).

Našli jste v článku chybu?