Динамично конфигуриране на ядрото
на Linux
от Владимир Джувинов <[email protected]>
Linux предлага възможност за динамично конфигуриране на част от параметрите
в ядрото на операционната система. Това позволява текущ контрол над работата
на виртуалната памет, файловата система и мрежовата дейност, без да се
налага рекомпилиране на ядрото или рестартиране на компютъра. Динамичното
конфигуриране на ядрото се извършва чрез виртуалната /proc файлова система
или системната функция sysctl.
Кой се нуждае от динамично конфигуриране на ядрото?
На първо място са тези, които се нуждат от оптимално използване
на ресурсите под Linux. Такова оптимизиране може да е от голямо значение
за подобряване на работата на натоварени сървъри и работни станции. Това
се касае особено за тясно специализирани сървъри или когато се наблюдават
определени bottlenecks при работата на Linux. В такъв случай е добре да
сте рекомпилирали ядрото според специфичните Ви нужди, преди да пристъпите
към неговото динамично конфигуриране.
Динамичното конфигуриране не се препоръчва на компютри, които са слабо
натоварени и рядко достигат лимита на капацитета си. В тези случаи то би
било безсмислено, защото не биха се забелязали подобрения в работата.
Разбира се, тази статия би представлявала интерес и за тези, които ползват
Linux като играчка за големи и търсят нови начини за експериментиране ;)
Proc интерфейсът
/proc е псевдо-файлова система, която се използва като интерфейс
към вътрешните структури на ядрото. "Псевдо", защото тя не заема дисково
пространство, а е разположена в паметта на ядрото. Отделните структури
и променливи от ядрото са представени като файлове и директории в /proc.
Повечето файлове са read-only, но има и такива с write permission. Точно
те позволяват промяна на съответните променливи в ядрото.
Каква информация ни предоставя /proc интерфейсът?
Първоначално /proc е била направена с цел да дава информация за текущите
процеси, оттам идва и наименованието и - process information pseudo-filesystem.
В /proc под pid-а на всеки текущ процес има директория с неговите параметри.
Във всяка директория параметрите са групирани в файлове. Например файлът
cwd сочи към текущата работна директория на процеса, а maps представлява
карта на виртуалната му памет. Командата ps, която показва статуса на текущ
процес (виж man ps) използва точно /proc като интерфейс към ядрото.
Освен информация за текущите процеси, в /proc се съдържат други въведения.
Те се отнасят изключително за хардуера и системната конфигурация. Тук е
важно да се отбележи следното - това какви файлове и директории се намират
във вашата /proc директория, зависи изцяло от хардуера на вашия компютър,
как е компилирано ядрото и каква е версията на кода му. Файловете cpuinfo(информация
за микропроцесора) и ioports(информация за входно-изходните устройства)
са неотменни за всеки компютър, докато scsi ще намерите само ако разполагате
със scsi дискове поддържани от ядрото.
И така, как става четенето на информация от /proc?
Тъй като се касае за файлове и директории, макар и виртуални, можем
да използваме обичайните cd и cat. Ето например една проверка на регистрираните
interrupts:
[vd298@tarrant /]$ cat /proc/interrupts
CPU0
0: 371478
XT-PIC timer
1:
5948 XT-PIC
keyboard
2:
0 XT-PIC cascade
4:
17787 XT-PIC
serial
8:
2 XT-PIC rtc
10: 37315
XT-PIC es1371
11:
0 XT-PIC eth0
13:
0 XT-PIC fpu
14: 31444
XT-PIC ide0
15:
16 XT-PIC ide1
NMI:
0
Тъй като interrupt параметрите се променят динамично, не очаквайте да
намерите същата информация при повторното прочитане на interrupts файла.
Други файлове като version(версия на ядрото) пък съдържат статична информация
и тяхното съдържание не се променя.
Информация за /proc интерфейса може да намерите на следните места:
man proc :- Добро общо описание на proc, макар и да не е съвсем
актуално.
/usr/src/linux-2.*.*/Documentation/proc.txt :- Отличен извор
на информация, описва всички възможни файлове, които може да срещнете в
/proc и какво точно означават те.
Разбира се, най-актуалната информация се намира в самия програмен
код на Linux.
Поддръжката на /proc от ядрото се обуславя от следните компилационни
опции: CONFIG_BSD_PROCESS_ACCT, CONIG_SYSCTL и CONFIG_PROC_FS. Те са до
голяма степен необходми за правилното функциониране на всяка стандартна
Linux система и би трябвало да са включени в популярните дистрибуции.
Принцип на динамичното конфигуриране
Начините за динамично конфигуриране на ядрото са два:
[1] чрез /proc:
Както беше споменато, има файлове в /proc, които са с write permission.
Това позволява тяхното съдържание да бъде променяно, което води и до промяна
на съответните параметри в ядрото.
Проверката кои файлове са с write permission най-лесно се извършва с
командата ls -l.
Например проверяваме директорията /proc/sys/kernel, която съдържа параметри
отнасящи се до ядрото като цяло. Лявата колонка показва permission:
[vd298@tarrant /]$ ls -l /proc/sys/kernel
total 0
-rw-r--r-- 1 root
root
0 Sep 8 10:03 acct
-rw------- 1 root
root
0 Sep 8 10:03 cap-bound
-rw-r--r-- 1 root
root
0 Sep 8 10:03 ctrl-alt-del
-rw-r--r-- 1 root
root
0 Sep 8 10:03 domainname
-rw-r--r-- 1 root
root
0 Sep 8 10:03 hostname
-rw-r--r-- 1 root
root
0 Sep 8 10:03 modprobe
-r--r--r-- 1 root
root
0 Sep 8 10:03 osrelease
-r--r--r-- 1 root
root
0 Sep 8 10:03 ostype
-rw-r--r-- 1 root
root
0 Sep 8 10:03 panic
-rw-r--r-- 1 root
root
0 Sep 8 10:03 printk
-rw-r--r-- 1 root
root
0 Sep 8 10:03 rtsig-max
-r--r--r-- 1 root
root
0 Sep 8 10:03 rtsig-nr
-rw-r--r-- 1 root
root
0 Sep 8 10:03 shmall
-rw-r--r-- 1 root
root
0 Sep 8 10:03 shmmax
-rw-r--r-- 1 root
root
0 Sep 8 10:03 sysrq
-r--r--r-- 1 root
root
0 Sep 8 10:03 version
Конфигурирането става със стандартната команда echo (за изписване на
текстов ред) и операторът за пренасочване '>' (ouput redirection). Обикновено
echo изписва зададения текст на стандартния изход(stdout). С оператора
за пренасочване обаче ще пренасочим зададения текст към желания от нас
файл, вместо към дисплея на конзолата.
Не забравяйте, че са нужни root привилиегии за да извършите промяна
на файловете!
Ето например как може да бъде извършено конфигурирането на panic файла,
който дава достъп до променливата panic_timeout. Тя определя колко секунди
след kernel panic да се рестартира компютъра. Ако стойността е 0, автоматично
рестартиране няма да бъде извършено.
Първо проверяваме текущата стойност на panic:
[root@tarrant kernel]# cat panic
0
Очевидно компютърът няма автоматично да се рестартира при kernel
panic. Затова променяме стойността на 15 секунди и проверяваме дали промяната
е успешна:
[root@tarrant kernel]# echo 15 > panic
[root@tarrant kernel]# cat panic
15
Когато даден файл съдържа повече от един параметър, промяната става
по следния начин:
[root@tarrant vm]# cat buffermem
2 10 60
[root@tarrant vm]# echo 2 10 25 > buffermem
[root@tarrant vm]# cat buffermem
2 10 25
[2] чрез системната функция sysctl
Тази системна функция е Linux специфична и не отговаря на POSIX стандарта.
Може да се използва при писането на C програми, които директно да променят
конфигурацията на ядрото. За повече информация се обърнете към man sysctl
и съответните header файлове на Linux.
В документацията изрично се предупреждава, че имената на променливите
зависят от версията на Linux, затова програмите ползващи sysctl могат да
имат проблеми с портабилността!
Най-важните параметри за конфигуриране
Най-голямо значение за оптималната работа на компютъра имат следните
/proc интерфейси:
-
Виртуалната памет. Това са файловете в /proc/sys/vm
-
Файловата система. Това са файловете в /proc/sys/fs
-
Мрежовите функции: Това са файловете в /proc/sys/net
Документация за изброените /proc интерфейси се намира в /usr/src/linux-2.*.*/Documentation/proc.txt
и в директорията /usr/src/linux-2.*.*/Documentation/sysctl/
Конфигуриране на виртуалната памет
За целенасоченото оптимизиране на виртуалната памет е абсолютно
необходимо познаването на нейните принципи и изпълнение. Тук няма да се
спираме на нея, тъй като темата е голяма (виж Computer Architecture: A
Quantitative Approach на Patterson и Hennessy).
Ето някои от по-важните файлове намиращи се в /proc/sys/vm и какво контролират
те:
bdflush : контролира работата на bdflush демона, който отговара
за прочистването на използваните буфери от работната памет към диска (виж
man bdflush)
buffermem : контролира количеството на буферната памет
freepages : контролира количеството на свободните vm (virtual memory)
страници
kswapd : контролира работата на kswapd демона, който прехвърля по-рядко
използваните vm страници в swap файла
pagecache : контролира количеството на дисковия кеш
Добре е след всяка промяна да проверите състоянието на виртуалната памет
от файла /proc/meminfo. Имайте обече предвид, че промените не настъпват
веднага.
Преди една евентуална промяна в конфигурацията на виртуалната памет,
е добре да се определи характера на преобладаващите действащи процеси (т.е.
за какво се използва компютъра) и техните изисквания към виртуалната памет.
При сървъри с висока I/O активност (например SAMBA сървъри) дисковия кеш
има много голяма роля, защото компенсира бавната скорост на дисковете.
Обратно, при работни станции с висока процесорна активност (например CAD)
количеството на дисковия кеш може да бъде редуцирано, за да се предоставят
повече свободни vm страници.
Конфигуриране на файловата система
Файловете в /proc/sys/fs/ контролират управлението на файловата
система под Linux. Отново е желателно да сте запознат с утройството на
файловата система, преди да помислите за оптимизиране. По принцип, ако
дисковата I/О активност на компютъра не е много висока, няма нужда от промяна
на параметрите.
Някои от по-важните файлове и какво контролират те:
file-max : контролира максималния брой на едновременно отворените
файлове (default 4096)
inode-max : контролира максималния брой на inodes
super-max : контролира максималния брой на super blocks
Както се вижда, ре-конфигурирането на файловата система е нужно
само при голям брой едновременно отворени файлове (над 4096). За количественото
отношение между отворените файлове, inodes и super blocks прочетете /usr/src/linux-2.*.*/Documentation/sysctl/fs.txt.
Конфигуриране на мрежовите функции
Интерфейсът към мрежовите процедури на ядрото се намира в /proc/sys/net/.
Съдържанието на тази директория зависи от хардуера на вашата машина и от
опциите, с които е компилирано ядрото.
Ето описание на някои параметри:
core/ : от тази директория се управляват базисните (или по-примитивни)
мрежови опции - това са приемните и предавателните буфери
unix : тук се съдържат два файла, които контролират изтриването на използваните
socket descriptors
ipv4 : в тази директория се съдържат настройките отнасящи се до IPv4
протокола, например:
icmp_echo_ignore_broadcasts : контролира ICMP разпръскването,
може да се използва за предотвратяване на ICMP flooding
ip_forward : тази опция е активирана при router сървърите
tcp_retries2 : контролира броя на TCP ретрансмисиите преди отказ
appletalk : директория съдържаща настройките отнасящи се до Appletalk протокола
ipx : директория съдържаща натройките отнасящи се до IPX протокола
Общият брой на параметрите може да бъде много голям (няколко десетки),
особено при сървъри с повече от един протоколен интерфейс.
Важно е при промяна на мрежовите настройки да се има предвид, че много
от тях са директно свързани с мрежовата сигурност!
Запазване на конфигурацията
Всички динамични конфигурации се загубват при рестартиране на компютъра.
При всяко зареждане ядрото възвръща обичайната си default конфигурация.
Това предлага добра защита при грешна конфигурация. Ако сте сгрешили
фатално и сте направили операционната система неконтролируема или сте забравили
първоначалната конфигурация, просто рестартирайте компютъра.
Ако пък искате всеки път ядрото да заема желаната от вас конфигурация,
напишете скрипт, който да бъде извикван от init при всяко стартиране на
Linux.
За напреднали
/proc файловата система и начина за нейното конфигуриране напълно
съответстват с Unix философията за единна входно-изходна система (unified
input-ouput system). Това позволява параметрите на ядрото да бъдат конфигурирани
по един лесен и познат начин като обикновени файлове.
Но какви са възможностите за търсене на оптимална конфигурация?
[1] Чрез експериментиране могат да се постигнат добри резултати
и също така да се открият някои неочаквани неща. То обаче може да не се
окаже достатъчно ефикасно, особено когато голям брой параметри трябва да
бъдат конфигурирани.
[2] Внимателено проследяване на работата на системата в продължение
на няколко дни и след това анализиране на резултатите
[3] Специална програма работеща в user space. Тя би следила по-важните
текущи параметри на системата и въз основа на тях би нанасяла корекции
в реално време. При големи инсталации, една такава програма би работила
на отделен сървър, откъдето да обслужва останалите системи по мрежата (би
било интересно някой да напише една такава програма ;)
Тук трябва да се отбележи, че съществува тенденция за увеличаване
на възможностите за динамично конфигуриране на Linux ядрото. Затова в бъдеще
/proc най-вероятно ще се разрастне и ще включи нови параметри.
08.09.2000