Home    Решения    Услуги    Download    Публикации    Работа    Продукти    Документи
 

 

 
Print this page/Отпечатай тази страница  

 
 

Динамично конфигуриране на ядрото на 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 най-вероятно ще се разрастне и ще включи нови параметри.
 
 

Владимир Джувинов
[email protected]


 

08.09.2000