Ядро Linux гибкое, и вы даже можете менять способ его работы налету, путем динамической смены некоторых из его параметров, благодаря команде sysctl. Sysctl предоставляет интерфейс, позволяющий вам исследовать и менять несколько сотен параметров ядра в Linux или BSD. Изменения имеют эффект незамедлительно и также можно сохранять их и после перезагрузки. Разумно используя sysctl, вы можете оптимизировать вашу систему без перекомпиляции ядра, и получить результаты немедленно.
Чтобы начать изучение того, что sysctl может изменить, выполните sysctl -a, и вы увидете возможные параметры. Список может быть достаточно большим: на моей текущей системе есть 712 возможных настроек:
Если вы хотите получить значение одной переменной, используйте что-то, вроде sysctl vm.swappiness, или просто sysctl vm, чтобы получить список всех переменных, которые начинаются на «vm.». Добавьте опцию -n, чтобы выводились только значения переменных, без имен; -N приведет к противоположному эффекту и выведет имена, но не значения.
Вы можете изменить любую переменную, используя опцию -w со следующим синтаксисом: sysctl -w переменная=значение. Например: sysctl -w net.ipv6.conf.all.forwarding=1 устанавливает соответствующей переменной значение true (0 обозначает «нет», или false; 1 значит «да», или true), что включает форвардинг IP6. Вам может и не понадобится опция -w, — она кажется запрещенной. Проведите самостоятельно несколько экспериментов, чтобы убедиться в этом.
Значение sysctl загружаются во время загрузки системы из файла /etc/sysctl.conf. В этом файле могут быть пустые строчки, комментарии (строки, начинающиеся на символ «#» или точку с запятой), а также строки в формате «переменная=значение». Например, мой файл sysctl.conf приведен ниже. Если вы хотите применить его в любой момент времени, вы можете сделать это с помощью команды sysctl -p.
# Disable response to broadcasts.
net.ipv4.icmp_echo_ignore_broadcasts = 1
# enable route verification on all interfaces
net.ipv4.conf.all.rp_filter = 1
# enable ipV6 forwarding
net.ipv6.conf.all.forwarding = 1
# increase the number of possible inotify(7) watches
fs.inotify.max_user_watches = 65536
Как решить, что делать с таким большим количеством параметров настройки? Увы, это больной вопрос sysctl: большинство релевантной документации спрятано во множестве исходных файлов ядра Linux, она труднодоступна и не может помочь, так как объяснения иногда скрыты и тяжелы для понимания. Кое-что вы можете найти в директории /usr/src/linux/Documentation/sysctl, но большинство (если не все) файлов там ссылаются на ядро 2.2 и, похоже, не обновлялись последние несколько лет.
Поиск по теме в книгах, возможно, сильно не поможет. Я нашел hack#71 в Linux Server Hacks, Volume 2 (O'Reilly) от 2005 года, и это все. Несколько других книг ссылаются на sysctl, но со специфическими параметрами или возможностями, вы предоставлены сами себе.
В качестве эксперимента, я попробовал поискать информацию о параметре swappiness, который может оптимизировать управление виртуальной памятью. Файл /usr/src/Linux/Documentation/sysctl/vm.txt даже не ссылался на него, возможно, потому что этот параметр появился в версии ядра 2.6. Общий поиск во всех директории /usr/src/linux вернул пять файлов, содержащих «swappiness»: три заголовочных (.h) файла в include/linux, плюс kernel/sysctl.c и mm/vmscan.c. Последний файл содержал следующую информацию:
/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;
Вот оно! Вы можете видеть значение по умолчанию (60) и минимальное объяснение значения этого параметра. Насколько полезно это может быть?
Виртуальная директория /proc/sys также предоставляет интерфейс для параметров sysctl, позволяя вам проверять и менять их. Например, файл /proc/sys/vm/swappiness эквивалентен параметру vm.swappiness в sysctl.conf. Просто забудьте о начальной части «/proc/sys/», замените точками слеши и вы получите соответствующий параметры sysctl (кстати, эта замена вообще-то и не требуется; слеши также принимаются, хотя, похоже, что все используют вместо них нотацию с точками). Вот почему echo 10 >/proc/sys/vm/swappiness это то же самое, что и sysctl -w vm.swappiness=10. Но, как оказывается на практике, если файл /proc/sys предназначен только для чтения, вы не сможете настроить его с помощью sysctl.