Dynamická konfigurácia jadra operačného systému FreeBSD – 2. časť

Minulá časť seriálu o operačnom systéme FreeBSD vysvetľovala základné princípy fungovania rozhrania sysctl a na niekoľkých príkladoch ukázala spôsoby ako konfigurovať jadro FreeBSD jednorazovo i ako aplikovať nastavenia po každom štarte operačného systému. Pokračovanie minulej témy je orientované praktickejšie: vysvetľuje význam niektorých sysctl premenných, ktoré sa menia najčastejšie. Pri každom parametri je uvedené, či je určený iba načítanie, či ho možno meniť počas behu operačného systému, alebo či musí byť nastavený pri štarte FreeBSD. Pre úplnosť sú v tabuľke uvedené prefixy mien sysctl premenných a podsystémy jadra operačného systému FreeBSD, ku ktorému sa sysctl premenné s týmito prefixmi vzťahujú.

Prefix sysctl premennej Subsystém jadra
kern základné funkcie jadra
vm správa virtuálnej pamäte
vfs správa súborových systémov
net sieťový subsystém
debug ladiace informácie
hw nastavenia hardvéru
machdep premenné závislé na architektúre počítača
user niektoré nastavenia používateľského prostredia
p1003_1b nastavenie parametrov normy POSIX
jail virtuálny stroj jail
compat ABI – application binary interface

kern.quantum – Maximálna doba v mikrosekundách, počas ktorej môže bežať jeden proeces, ak sú v systéme spustené aj iné procesy, ktoré čakajú na pridelenie procesorového času. Táto premenná sa môže meniť počas behu operačného systému a jej defaultná hodnota je 100000, t.j. 10 milisekúnd. Premenná kern.quantum sa mení zvyčajne iba v prípade používania tzv. device polling; tento prípad je zdokumentovaný v súbore /usr/src/sys/i386/conf/LINT, v ktorom sa nachádzajú všetky parametre, ktoré možno použiť v konfiguračnom súbore jadra operačného systému pri jeho kompilácii. Táto sysctl premenná sa vo verzii operačného systému FreeBSD 5.x používa na určenie, ktorý z dvoch možných plánovačov procesov sa aktuálne používa. V prípade používania klasického BSD plánovača príkaz

% sysctl kern.quantum

vypíše hodnotu tejto premennej obvyklým spôsobom, ale v prípade používania nového ULE plánovača, ktorý túto hodnotu nepoužíva, uvedený príkaz vypíše chybové hlásenie

sysctl: unknown oid 'kern.quantum'

vm.swap_enabled – Tento prepínač zapína či vypína používanie odkladacieho priestoru. Ak je nastavený na hodnotu 0, nebude operačný systém odkladací priestor používať. Toto nastavenie sa môže hodiť v prípade poškodenia disku, na ktorom sa nachádza odkladací priestor. Defaultne je tento prepínač nastavený na hodnotu 1, t.j. použitie odkladacieho priestoru je povolené. Nastavovať ho možno iba pred zavedením jadra operačného systému.

Inú zaujímavú voľbu týkajúcu sa odkladacieho priestoru možno použiť aj v konfiguračnom súbore jadra operačného systému FreeBSD pri jeho kompilácii:

options NSWAPDEV=4

Hodnota tejto premennej udáva maximálny počet odkladacích priestorov, ktoré môže jadro operačného systému súčasne používať. Defaultne je nastavená na hodnotu 4. V praxi ale taký veľký počet odkladacích priestorov nebýva, ale jadro operačného systému musí pre takýto počet odkladacích priestorov alokovať štruktúry v pamäti bez ohľadu na to, koľko sa ich v skutočnosti používa. Nastavenie hodnoty NSWAPDEV na hodnotu rovnajúcu sa počtu používaných odkladacích priestorov môže ušetriť určité množstvo pamäte alokovanej samotným jadrom systému (ktorá sa navyše nikdy neodkladá), najmä ak je veľkosť najväčšieho odkladacieho priestoru veľmi veľká.

S počtom používaných odkladacích priestorov súvisí aj ďalší nastaviteľný sysctl parameter – wm.swap_async_max, ktorého hodnota udáva maximálny počet asynchrónnych operácií odkladania stránok do odkladacieho priestoru, ktoré môžu prebiehať súčasne. Defaultne je tiež nastavený na hodnotu 4, ktorá sa po zmene hodnoty parametra NSWAPDEV nezmení. Nemá význam, aby bežalo viac operácií odkladania, ako je nezávislých odkladacích priestorov. Zároveň je potrebné zvážiť, či je do odkladacích priestorov (ak ich je viacero) možné zapisovať skutočne paralelne, t.j. či či každý z nich je umiestnený napríklad na inom fyzickom IDE disku, z ktorých každý je pripojený na inom IDE radiči.

vm.swap_idle_enabled – Ak v systéme dochádza príliš často k stránkovaniu, možno sa pokúsiť čiastočne riešiť situáciu nastavením tohto parametra na hodnotu 1, v dôsledku čoho začne systém odkladať z fyzickej operačnej pamäte do odkladacieho priestoru neaktívne procesy skôr ako aktívne. Defaultne je taktéto správanie sa podsystému virtuálnej pamäte vypnuté a parameter je nastavený na hodnotu 0. O tom, kedy začne jadro operačného systému považovať procesy za neaktívne, rozhodujú hodnoty ďalších dvoch sysctl premenných, vm.swap_idle_treshold1 a vm.swap_idle_treshold2 defaultne nastavených na hodnoty 2 a 10 v uvedenom poradí. Tieto hodnoty vo väčšine prípadov vyhovujú a na zapnutie odkladania neaktívnych procesov stačí nastaviť premennú vm.swap_idle_enabled na hodnotu 1. Všetky tri uvedené premenné možno nastavovať počas behu operačného systému FreeBSD.

Ak je záťaž na virtuálnej pamäte permanentne vysoká, ladenie zaobchádzania operačného systému s odkladaním stránok fyzickej pamäte do odkladacieho priestoru problémy nevyrieši, môže riešeniu len trochu napomôcť. Lepšie je prijať systémovejšie opatrenia, napr. eliminovať proces vytvárajúci záťaž, ak je to možné. Ak je takýchto procesov viacero, pokúsiť sa ich rozložiť tak, aby nebežali súčasne (posunúť čas automatického zálohovania aby sa nekryl z časom automatickej aktualizácie zdrojových kódov v strome portov, navyše ak popri tom beží kompilácia systému, a pod.). Konečným riešením je zvýšenie objemu fyzickej pamäte v systéme. Pridanie operačnej pamäte systému, ktorý jej má nedostatok, má zvyčajne na výkon a odozvu systému väčší vplyv, ako zdvojnásobenie taktovacej frekvencie procesora. Naopak, ak k stránkovaniu vo väššom rozsahu dochádza iba ojedinele, je zbytočné investovať do operačnej pamäte a využitie odkladacieho priestoru na prekonanie krátkodobého nedostatku fyzickej pamäte je v tomto prípade vhodné.

O operačnom systéme FreeBSD sa tvrdí, že zvyčajne používa odkladací priestor viac ako niektoré iné operačné systémy unixovského typu, ale zároveň si pozorní používatelia môžu všimnúť, že množstvo operačnej pamäte označenej vo výpise programu top(1) ako voľnej je málo. Obe tieto skutočnosti sú do istej miery pravdivé a na ich objasnenie je potrebné poznať niekoľko faktov. Prvým je ten, že pamäť, ktorá je skutočne voľná, je pre systém zbytočná. Operačné systémy unixovského typu sa snažia všetku pamäť, ktorá nie je potrebná pre procesy, použiť ako vyrovnávaciu pamäť pre vstupno-výstupné operácie, ktoré patria k najpomalším operáciám počítača, a tak sa ich snažia urýchliť. Zatiaľ čo niektoré iné operačné systémy sa k odkladaniu stránok do odkladacieho priestoru uchyľujú iba v krajnom prípade nedostatku fyzickej pamäte, operačný systém FreeBSD sa v tomto smere správa proaktívne: odkladá niektoré stránky dlho neaktívnych procesov do odkladacieho priestoru a uvoľňuje si tak pamäť, ktorú potrebuje pre aktívne procesy a vyrovnávacie pamäte. Tým dosiahne lepšiu efektivitu práve vykonávaných procesov na úkor trochu pomalšieho prebudenia procesov, ktoré sú dlhodobo neaktívne. Táto proaktivita má samozrejme svoje obmedzenia a kontrolné mechanizmy, takže sa nestane, že keď zostane počítač niekoľko hodín nečinný, budú všetky procesy odložené v odkladacom priestore.

hw.ata.wc – Povoľuje alebo zakazuje používanie hardvérovej vyrovnávacej pamäte IDE pevných diskov. Defaultne je tento parameter nastavený na hodnotu 1, t.j. používanie vyrovnávacích pamätí diskov je povolené. Ak sa pred zavedením jadra operačného systému nastaví tento parameter na hodnotu 0, tak sa hardvérová vyrovnávacia pamäť IDE pevných diskov nebude používať, čo má za následok zníženie výkonnosti diskového podsystému pri operáciách zápisu údajov. Toto zníženie výkonnosti môže byť niekedy dosť dramatické, najmä pri starších pevných diskoch. Na druhej strane môže vypnutie spomínaných vyrovnávacích pamätí predísť privedeniu súborového systému do nekonzistentného stavu v prípade výpadku napájacieho napätia. V takom prípade pevné disky síce zvyčajne garantujú schopnosť tzv. atomického zápisu sektoru (to znamená, že ak sa začal zapisovať nejaký sektor na pevnom disku a zároveň došlo k výpadku napájacieho napätia, bude tento sektor korektne dopísaný až do konca), ale dopísať obsah vyrovnávacej pamäte už nie je možné. Vyrovnávacie pamäte súčasných pevných diskov sú obrovské (niekoľko MB) z pohľadu možnosti implementovať do ich hardvéru takúto črtu.

net.inet.icmp.drop_redirect – Defaultá hodnota tohto parametra je 0. Ak sa však nastaví na hodnotu 1, bude systém ignorovať všetky ICMP redirect pakety. Hoci toto správanie sa odporuje štandardu pre TCP/IP, ICMP redirect pakety sa vyskytujú iba veľmi zriedkavo a takmer nikdy sa nevyskytujú odôvodnene. Parameter je možné meniť počas behu operačného systému.

net.inet.icmp.log_redirect – Prepínač, ktorý v prídade nastavenia na hodnotu 1 zapína logovanie všetkých ICMP redirekt paketov, ktoré systém prijme. Defaultná hodnota tohto parametra je 0 a môže sa nastavovať počas behu operačného systému.

net.inet.tcp.blackhole – Protokol TCP/IP vráti pri pokuse o pripojenie k portu, na ktorom sa žiadne spojenie neočakáva, chybové hlásenie. Na strane klienta je potom obvykle zobrazená chyba connection reset by peer. Ak je táto premenná nastavená na hodnotu 1, budú všetky pokusy o pripojenie na uzavreté TCP porty jednoducho ignorované. Toto nastavenie spomaľuje skenovanie portov a neodosiela žiadne sieťové pakety oznamujúce chybu pripojenia na uzavretý TCP port. Túto premennú možno nastavovať počas behu operačného systému a jej defaultná hodnota je 0.

net.inet.udp.blackhole – Význam tejto premennej je rovnaký ako v predchádzajúcom prípade, ale platí pre spojenia prichádzajúce na uzavreté UDP proty. Možno ju meniť počas behu operačného systému a jej defaultná hodnota je 0.

net.inet.tcp.log_in_vain – Tento prepínač je defaultne nastavený na hodnotu 0. Kedykoľvek počas behu operačného systému je možné ho nastaviť na hodnotu 1, čím sa zapne logovanie všetkých pokusov o pripojenie na uzatvorené TCP proty, t.j. na porty, na ktorých nebeží žiadna služba, ktorá by očakávala prichádzajúce sieťové pripojenie. Takto možno odhaliť napríklad skenovanie portov. Na druhej strane môže byť takéto logovanie nebezpečné tým, že môže produkovať veľké množstvo logovacích záznamov.

net.inet.udp.log_in_vain – Tento prepínač má zhodnú defaultnú hodnotu, spôsob nastavovania aj význma ako predcházajúci, ale vzťahuje sa na pripojenia k uzavretým UDP portom.

net.inet.tcp.always_keepalive – Keď je tento prepínač nastavený na hodnotu 1, čo je zároveň jeho defaultná hodnota, operačný systém bude postupne vyhľadávať a ukončovať všetky neaktívne spojenia. Budú sa tak uvoľňovať systémové prostriedky alokované sieťovými spojeniami, ktoré neboli korektne ukončené z dôvodu výpadku sieťového spojenia, pádu pripojenej aplikácie a pod. Na druhej strane môže byť v niektorých prípadoch vhodné nastaviť tento parameter na hodnotu 0 – je možné tak urobiť počas behu operačného systému – systém tak bude udržiavať všetky spojenia. Je to výhodné pri existencii sieťových spojení, ktoré sú uzavreté po nespoľahlivých linkách, ktoré z času na čas vypadávajú, ale opätovne sa obnovujú. Dôležité samozrejme je, aby bolo uzatváranie prerušených spojení vypnuté na oboch jeho stranách.

FreeBSD Project Home