Hlavní navigace

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

11. 9. 2001
Doba čtení: 4 minuty

Sdílet

Minule jsme začali rozebírat soubor informací o SLABu - kešovacím alokátoru objektů v Linuxu. Dneska se dostaneme k významu jednotlivých položek, tedy typů objektů a jim odpovídajících keší.

Tak a tradice už bylo dost. Protože už jsme téměř u konce výpisu základních souborů, zde jsou soubory, které nám ještě zbývají:

  slabinfo   acpi/     irq/      tty/
  stat       bus/      net/
  swaps      driver/   nv/
  uptime     fs/       sys/
  version    ide/      sysvipc/
slabinfo – pokračování

Minule jsme probrali úvod a hlavičku, teď jsou na řadě jednotlivé řádky souboru a jejich význam. Pokud to bude možné, budu používat termín cache, pokud bude nutné skloňovat nebo něco podobného, uchýlím se k české alternativě VP = vyrovnávací pamět stejného významu. Pokud existuje nějaký český překlad (jiný než rychlá vyrovnávací pamět), dejte mi vědět, rád se poučím.

...
kmem_cache            54     78    100    2    2    1
...

První cache je určena pro ostatní cache. Jednoduše řešeno je to seznam ostatních VP. Jak vidno, vše sedí, neboť ve výpise je právě 54 řádků a tedy 54 aktivních objektů dle prvního sloupce. Tato cache zabírá dva slaby (jeden slab na stránku), tedy 8KB.

...
tcp_tw_bucket          0      0     96    0    0    1
tcp_bind_bucket        3    113     32    1    1    1
tcp_open_request       0      0     64    0    0    1
inet_peer_cache        0      0     64    0    0    1
ip_fib_hash            5    113     32    1    1    1
ip_dst_cache           0      0    160    0    0    1
arp_cache              0      0    128    0    0    1
...

Tento blok VP je určen pro objekty síťového rozhraní, jedná se o VP pro síťové spojení v různých stavech protokolu. tcp_tw_bucket je pro sokety ve stavu TIME_WAIT, nastane po uzavření soketu a je určen pro ošetření paketů, které jsou v tu chvíli ještě na síti. tcp_bind_bucket slouží pro znovupoužití portů, tcp_open_request je určen pro informace o otevřeném TCP spojení, inet_peer_cache pro směrovací informace, if_fib_hash pro forwarding (FIB – Forwarding Information Base), ip_dst_cache pro cache směrovacích cest a arp_cache pro překlad adres pomocí ARP.

...
blkdev_requests      256    280     96    7    7    1
dnotify cache          0      0     20    0    0    1
file lock cache        5     42     92    1    1    1
fasync cache           1    202     16    1    1    1
...

blkdev_requests je VP pro požadavky na přístup k blokovým zařízením, dnotify cache je VP pro požadavky na oznamování změn v souborech. Existuje nový, ješte nedokumentovaný (v man na RH 7.0 :) typ volání fcntl(), a to F_NOTIFY. Ten umožňuje reagovat na změny vytvoření, modifikace, přístupu nebo smazání souborů. file lock cache je určena pro struktury s informacemi k souborovým zámkům, fasync cache je pro asynchronní požadavky na bloková zařízení.

...
uid_cache              4    113     32    1    1    1
skbuff_head_cache     40     48    160    2    2    1
sock                  43     45    832    5    5    2
sigqueue               1     29    132    1    1    1
cdev_cache           533   1298     64   13   22    1
bdev_cache          6044   8142     64  105  138    1
mnt_cache             10     59     64    1    1    1
inode_cache        87793  88048    480 11006 11006    1
dentry_cache       65537  68940    128 2298 2298    1
filp                 966   1000     96   25   25    1
names_cache            0      2   4096    0    2    1
buffer_head        41001  47280     96 1172 1182    1
mm_struct             43     48    160    2    2    1
vm_area_struct      1776   1888     64   31   32    1
fs_cache              42     59     64    1    1    1
files_cache           42     45    416    5    5    1
signal_act            44     48   1312   15   16    1
...

uid_cache obsahuje informace o uživateli (počet procesů, otevřených souborů), skbuff_head_cache je VP pro síťové pakety, sock pro datové struktury soketů, sigqueue je určena pro fronty signálů, cdev_cache a bdev_cache jsou pro informace o znakových respektive blokových zařízeních, mnt_cache pro informace o existujících připojeních pro viruální soub. systém (VFS)., inode_cache pro struktury k i-uzlům, dentry_cache pro informace k vyhledávání adresářových cest, filp pro informace o otevřených souborech, names_cache pro buffery pro zpracování cest a názvů souborů, buffer_head pro struktury blokové cache, mm_struct pro informace o fyzických stránkách, vm_area_astruct pro informace o alokovaných oblastech v LAP (logickém adresovém prostoru), fs_cache je pro informace o umístění souboru v adresářové struktuře, files_cache pro tabulku otevřených souborů v jádře, signal_act pro informace o signálech v jádře.

...
size-131072(DMA)       0      0 131072    0    0   32
size-131072            0      0 131072    0    0   32
size-65536(DMA)        0      0  65536    0    0   16
size-65536             1      1  65536    1    1   16
...
size-64(DMA)           0      0     64    0    0    1
size-64             1083   1711     64   27   29    1
size-32(DMA)           0      0     32    0    0    1
size-32             9614  11639     32   99  103    1

A tohle už je vážně poslední skupina. Jedná se obecnou cache pro paměťové objekty o patřičných velikostech. Položky s (DMA) jsou navíc určeny pro DMA přenosy. To znamená na některých platformách jistá omezení. Například na x86 musí být tato paměť fyzicky umístěna v rozsahu 0–16MB.

uptime

Tohle je teké velmi jednoduché. Jsou zde dvě hodnoty. První udává vlastní uptime, tedy jak dlouho je již systém spuštěn. Druhá udává čas strávený ve stavu idle – tedy celkovou dobu, kdy nebylo nic na práci. Následuje příklad:

1712.17 1689.83

Jednotkou jsou v obou případech sekundy. Příkaz uptime ve stejnou dobu tedy vypíše:

  8:41am  up 28 min,  3 users,  load average: 0.15, 0.09, 0.03

A vskutku, 1712 sekund je 28 minut. Vzhledem k tomu, že psaní textu není moc náročná činnost (alespoň pro můj počítač :), je hodnota idle také 28 minut. Nicméně je vždy menší než celkový čas.

Teď ještě jak jsou hodnoty získány. To je prosté. V Linuxu existuje konstatnta HZ (na Intel x86 #definovaná jako 100, u Aplhy je to 1024 nebo 1200). Ta je použita pro nastavení časovače při startu systému a udává počet přerušení časovače za sekundu. Hlavním úkolem obsluhy přerušení časovače je potom při každém tiku inkrementovat proměnnou jménem jiffies, která potom udává počet tiků časovače od startu systému. Jde o unsigned long a je to veřejně přístupná proměnná (pro jádro). Hodnota uptime v souboru je tedy jednoduše jiffies/HZ. (Obecně to sice tak jednoduché není, protože je třeba ošetřit různá přetečení rozsahů a podobně, ale smysl zůstává stejný.) Druhé číslo vznikne podobně, ale čítač je inkrementován pouze při nečinnosti.

version

Opět jedna lahůdka. Informace zde skoro nepotřebují komentář, uznejte sami:

Linux version 2.4.9 (root@sirion) (gcc version 2.96 20000731 \
(Red Hat Linux 7.0)) #1 Út zář 4 19:28:22 CEST 2001

Jedná se o informace o verzi jádra Linuxu. Kromě vlastní verze (2.4.9) je zde zaznamenán i čas překladu, kdo ho prováděl a jaký byl použit překladač. Informace jsou natvrdo vloženy do jádra při překladu (viz. soubor init/version.c)