Hlavní navigace

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

23. 8. 2001
Doba čtení: 5 minut

Sdílet

Dnes jsme se konečně dostali na další písmeno. Je to M jako meminfo. Zbývá mi poslední týden volna, tak bych si ještě rád vyjel trochu do hor. Proto to dneska nebudeme moc přehánět. Na celý článek mám totiž "jenom" pár hodin. Tak ať se to raději projeví na kvantitě než na kvalitě.

V tomto dílu budete svědky malého zázraku. Po dlouhé době snad zvládneme více než jeden soubor. Na druhou stranu dva není zase až takový rozdíl :). Pravda, je to hlavně tím, že druhý soubor odbudeme pár větami.

ict ve školství 24

Jak velí tradice, nejprve výpis základního adresáře /proc. Tečka před názvem znamená, že už to máme za sebou:

  .840     .devices     .kcore    modules     stat     ide/
  .842     .dma         .kmsg     mounts      swaps    irq/
  .847     .execdomains .ksyms    mtrr        uptime   net/
  .848     .filesystems .loadavg  partitions  version  nv/
  .apm     .interrupts  .locks    pci         bus/     sys/
  .cmdline .iomem        meminfo  self@       driver/  sysvipc/
  .cpuinfo .ioports      misc     slabinfo    fs/      tty/
meminfo

Přehledný způsob, jak získat (nejen úplně základní) informace o stavu paměti. První dva řádky jsou stejné (až na jednotky) jako výpis programu free:

        total:    used:    free:    shared:  buffers: cached:
Mem:  262213632 115609600 146604032       0  3411968 58961920
Swap: 133885952        0 133885952
MemTotal:       256068 kB
MemFree:        143168 kB
MemShared:           0 kB
Buffers:          3332 kB
Cached:          57580 kB
SwapCached:          0 kB
Active:          18352 kB
Inact_dirty:     42560 kB
Inact_clean:         0 kB
Inact_target:        0 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       256068 kB
LowFree:        143168 kB
SwapTotal:      130748 kB
SwapFree:       130748 kB

Pro jednotlivé velikosti platí většinou celkem intuitivní pravidla. Nejprve první dva řádky. Total je celkové množství dostupné fyzické paměti/swapu v bajtech. U fyzické paměti je od velikosti skutečné fyzické paměti odečteno množství alokované pro jádro při startu systému. To lze nalézt ve výpise při bootování jádra. Used je množství nějakým způsobem použité paměti/swapu. Free je množství paměti, která je nevyužita (ani pro cache nebo jiné účely). Celkem dle očekávání platí Total = Used + Free. Dále, jak bylo řečeno, Fyz.RAM = Total + KernelMem.

Poněkud pofidérní položka je Shared. Intuitivně bych očekával, že jde o počet stránek (krát jejich velikost), které jsou sdíleny více procesy (například kód programu mingetty nebo Eterm). Bohužel v architekturách ia32, ia64, m68k, arm, alpha, parisc, ppc, sparc i s390 je na tohle místo natvrdo dosazena nula. To může znamenat dvě věci. Buď je význam této položky jiný než můj odhad, nebo všechny tyhle architektury nemají potřebný HW k tomu, aby se tato informace dala (rozumně) spočítat. Jediný, kdo něco počítá, je mips a cris.

Dále se dostáváme k paměti použité pro vyrovnávací účely. Jde o „Buffers“ a „Cached“. Paměť označená jako „Buffers“ je použita jako vyrovnávací paměť pro vstupně/výstupní operace nad blokovými zařízeními. Jsou zde tedy především bloky dat z disků. V Linuxu (narozdíl třeba od mnoha komerčních Unixů) není její velikost (maximum) pevně dána, ale využívá se pro tento účel i dostupná volná paměť. Začne-li paměť docházet, část bufferů se aktualizuje na cílovém médiu (pokud byly modifikovány) a uvolní se pro potřeby uživatelských programů. „Cached“ je obdoba pro stránky fyzické paměti. Časem se přišlo na to, že pokud uživatel čte/zapisuje data z/na externí zařízení (jako disk), je druhým koncem komunikace paměť. Proto má smysl provádět uchovávání obsahu ne na úrovni bloků, ale na úrovni paměťových stránek. Existuje proto systém, jak efektivně vyhledávat a manipulovat s patřičnými stránkami. Opět, pokud potřebujeme volnou paměť, najde se stránka, která již není používána, aktualizuje se na médiu a uvolní. Prvním systémem vyrovnávacích pamětí byly buffery na úrovni bloků, pak ale přišla stránková cache a zjistilo se, že je obecnější a výhodnější. Proto dnes existují dvě úrovně vyrovnávacích pamětí.

V dalším výpise se ještě opakují stejné položky, a to jmenovitě: MemTotal, MemFree, MemShared, Buffers, Cached, SwapTotal, SwapFree. Jejich význam je zcela identický s odpovídajícími složkami popsanými výše.

Aktivní stránky paměti jsou ty, které jsou v daném okamžiku skutečně využívány běžícími procesy. Neaktivní se potom dělí na modifikované – před uvolněním je třeba zapsat je někam na disk (do swapu), čisté – nemodifikované, ty lze uvolnit okamžitě, a tzv. target. To je číslo (velikost paměti), které udává míru aktivity subsystému pro správu paměti. Zjednodušeně by se to dalo označit jako průměrné množství paměti požadované za poslední měřený interval (řádově sekundy). Tak jako loadavg určuje zatížení procesoru, tohle číslo určuje zatížení VM (Virtual Memory) subsystému.

V Linuxu je paměť rozdělena na tzv. Low a High. High paměť byla (pro pamětníky) i v DOSu, dokonce s podobným významem jako tady. Jen velikosti a hranice se „trošku“ posunuly. V Linuxu je jako High paměť označována fyzická paměť za hranicí normálního adresování v 32bitovém režimu (přes 4GB). Tato paměť není (jako v DOSu) přímo dostupná a musí se pro použití namapovat (viz třeba EMS) do adresovatelné oblasti. Linux tak dokáže pracovat až s 64GB fyzické paměti. Tento systém rozdělení paměti je charakteristický pro 32bitové architektury (konkrétně ia32). Alphy a ia64 už takové zbytečnosti díky svému rozsahu adres nepotřebují.

misc

Soubor misc obsahuje výpis obsazených vedlejších čísel pro zařízení s hlavním číslem 10:

175 agpgart
135 rtc
134 apm_bios
  1 psaux

Při výpisu adresáře /dev vidíme následující (pro klasický /dev bez devfs).
ls -l /dev | grep " 10," (zkráceno):

crw-rw-r--    1 root     root      10, 175 srp 24  2000 agpgart
crw-rw----    1 root     root      10,   4 srp 24  2000 amigamouse
crw-------    1 root     root      10, 134 čen 11 22:21 apm_bios
crw-rw----    1 root     root      10,   1 srp 20 19:17 psaux
crw-rw----    1 root     root      10,   1 srp 24  2000 psmouse
crw-rw-r--    1 root     root      10, 135 srp 24  2000 rtc
crw-rw----    1 root     root      10,   6 srp 24  2000 sunmouse
crw-rw----    1 root     root      10, 165 srp 24  2000 vmmon

O co jde? V počítači existuje poměrně dost zařízení, která se (téměř) vždy vyskytují pouze jednou. Klasickým příkladem je apm_bios nebo RTC – Real Time Clock. Pro ty by bylo zbytečné vyhradit jedno celé hlavní číslo a mít pouze jedno vedlejší (0). Proto je pro tato speciální zařízení vyhrazeno jedno hlavní číslo a jednotlivá zařízení se pak rozlišují číslem vedlejším. Pro jednoduší přehled právě využívaných vedlejších čísel (ke kterým je natažen odpovídající ovladač) existuje právě tento soubor.

Přiznávám, že část pojednávající o vyrovnávajících pamětech je poněkud strohá, a tudíž i možná trochu nepřesná. Bohužel nemám momentálně dostatek potřebných materiálů, abych si to mohl detailněji nastudovat. Jakmile tak učiním, ještě se k tomuto tématu krátce vrátím.

Autor článku