RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
а. к повышению некоторых лимитов, что в итоге позволяет ядру обрабатывать больше подключений, отправлять большее количество данных в секунду и эффективнее работать с сетевым оборудованием;
б. к изменению настроек таким образом, чтобы защитить ядро от различных видов атак и подстроить его под выполнение определенной задачи.
Этими двумя пунктами мы и будем руководствоваться.
Сетевые настройки ядра Free BSD
Увеличение производительности:
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=48000 — увеличиваем диапазон портов, доступных программам. Стоит изменять только на нагруженных серверах, использующих много исходящих подключений, таких как веб-прокси и ftp.
kern.polling.enable=1 — включаем device polling. Осуществляется самостоятельный опрос устройств вместо генерирования прерываний устройством, что позволяет значительно увеличить производительность при больших нагрузках на сетевую карту. Ядро должно быть собрано с опциями «options DEVICE_POLLING» и «optionsHZ=1000».
kern.ipc.somaxconn=2048 — увеличиваем очередь входящих подключений со 128 до 2048, что помогает нагруженному серверу принять больше подключений, а также затрудняет SYN флуд.
Защита от сетевых атак:
net.inet.tcp.blackhole=1
net.inet.udp.blackhole=1 — превращаем машину в черную дыру. Ядро не будет отправлять RST-пакет в ответ на обращение к незанятым портам. Сканеры портов не любятэтого.
net.inet.icmp.drop_redirect=1
net.inet.ip.redirect=0 — запрещаем ICMP - сообщения, приводящиекизменениютаблицымаршрутизации (тип 5: IP Redirect). Удивительно, но FreeBSD даже в 2007 году разрешает такие сообщения по умолчанию.
net.inet.ip.forwarding=0 — отключаем перенаправление пакетов с одного сетевого интерфейса на другой.
Счастливые обладатели высокоскоростных соединений (это в первую очередь Gigabit Ethernet) могут поэкспериментировать с размерами входных и выходных сетевых TCP-буферов, увеличивая значение переменных net.inet.tcp.sendspace и net.inet.tcp.recvspace. Но стоит помнить, что слишком объемные буферы быстро приведут к исчерпанию памяти при большом количестве подключений. Для веб-сервера, который принимает много коротких запросов и отправляет большие объемы данных, размер выходного буфера рекомендуется увеличить в ущерб входного. Производительность samba и squid можно увеличить, изменив значение переменной net.inet.tcp.delayed_ack на 0 и запретив таким образом отправку ответных ACK-сообщений вместе с данными. В случае интерактивных протоколов, таких как POP, IMAP, SMTP, SSH и FTP, это изменение приведет к заполнению сети лишними пакетами, содержащими лишь ACK-сообщения, и снижению производительности.
Полезные и не очень мелочи
В заключительной части статьи мы рассмотрим несколько интересных (с точки зрения практической выгоды) переменных. Для начала обратимся к неизменяемым переменным, которые будут полезны как источник информации. В первую очередь это переменная vm.vmtotal, которая в удобной для чтения форме показывает информацию о количестве процессов в системе, размере виртуальной и физической памяти, а также о количестве свободной. Далее — переменная vm.loadavg, содержащая таинственное значение «загруженности системы».
Вкратце объяснить эти числа невозможно, поэтому скажу только, что если все три числа подойдут к отметке «5», то значит где-то в системе создалось узкое место, которое может быть где угодно: в оперативной памяти, жестком диске, или заключаться в какой-то внутренней неполадке.
Теперь о переменных, изменять значение которых имеет смысл. К ним относится vfs.usermount, установив значение которой в единицу, мы позволим любому пользователю монтировать файловые системы к точке, принадлежащей ему.
Далее — hw.snd.pcm0.vchans и hw.snd.maxautovchans, позволяющие создать несколько виртуальных каналов для одной звуковой карты, что дает возможность одновременно слышать звук из нескольких источников без использования звуковых демонов. На домашней машине рекомендуется создать 4 канала — этого вполне достаточно для повседневных нужд.
Напоследок скажем пару слов об управлении питанием. Очень часто на форумах можно встретить вопросы вроде: «Как отключить кнопку Power?» или «Как отключить кнопку Sleep на клавиатуре?».
Ответ прост. Пишем в файл /etc/sysctl.conf строку «hw.acpi.power_button_state=NONE» или «hw.acpi.sleep_button_state=NONE» в зависимости от желаемого результата.
Также можно не отключать клавишу совсем, а просто изменить ее поведение, назначив ей любое из доступных состояний ACPI, перечисленных в переменной hw.acpi.supported_sleep_state. При этом S1 — самый низкий уровень энергосбережения (сон), а S5 — самый высокий (выключение).
Главное правило оптимизатора
Перед тем как приступать к изменению настроек ядра, стоит запомнить одну простую истину. По умолчанию ядро настроено на оптимальную производительность, и, как заметил Пол-Хеннинг Камп, улучшая производительность одной подсистемы, мы понижаем производительность другой. А компетентность этого человека в этом вопросе неоспорима.
Дорогу молодым
К сожалению, многое из того, что я хотел рассказать в этом материале, так и осталось в моей голове и на страницах многочисленных заметок. Читателям, жаждущим идти дальше, я предлагаю распечатать вывод команды sysctl -ad и читать его на ночь, время от времени заглядывая в англо-русский словарик. Те, кого интересуют переменные, связанные с jail, могут обратиться к моей статье «Тюрьма для чертенка», где они и описаны.
INFO
PawelJakubDawidek, один из коммитеров FreeBSD, написал интересный модуль ядра, воссоздающий дерево переменных sysctl в виде виртуальной файловой системы. Исходники модуля лежат на его сайте (garage.freebsd.pl) и на нашем диске.