| FreeBSD оптимизация сервера. Высокая сетевая и файловая нагрузка. |
| Автор Охальников Олег | |||||||
| 09:09:2010 г. | |||||||
|
Часто в сети возникают темы "Отваливается сеть" или "Сеть зависает" и так далее. Отдельные энтузиасты находят решение в виде скриптов реагирующих на событие отсутствие ping и перезапускают сетевую подсистему :). В данной статье расскажу как оптимизировать FreeBSD сервер для работы с высокими нагрузками, например 200 и более одновременных сетевых подключений, при которых данные непрерывно льются, частным (тестовым) примером может послужить transmission-daemon, с десяток закачек - раздач которого создадут в системе огромное количество активных подключений (у меня порядка 230 на момент написания статьи). Изначально FreeBSD настроена с усредненными значениями, которые в тех или иных ситуациях легко изменить с помощью sysctl. FreeBSD хранит сетевые данные в mbuf clusters, вывод текущего состояния можно легко посмотреть с помощью команды netstat -m: # netstat -m Меняем значение mbuf clusters на максимальное sysctl -w kern.ipc.nmbclusters=65536 (Пока мне не удалось превысить данное значение.) Смотрим# netstat -m vfs.vmiodirenable=1 kern.ipc.somaxconn - После того как соединение принято оно попадает в "listen socket queue". Собственно устанавливаем размер очереди kern.ipc.somaxconn=8192. Приложения работают не с сокетами, а с файлами. По этому для каждого сокета нужна структура, которая описывает файл. kern.maxfiles - всего файлов в системе. kern.maxfilesperproc - максимальное число файлов на один процесс. net.inet.tcp.rfc1323 (rfc3042 и rfc3390) - Переключатели времени исполнения. Включают различные функции TCP , описанные в RFC и достаточно безопасные. Если эти функции включены (1), некоторыедругие очень - очень старые системы не смогут установить соединение, либо соединение окажется очень медленным. net.inet.tcp.delayed_ack - Производительность samba и squid можно увеличить, изменив значение переменной net.inet.tcp.delayed_ack на 0 и запретив таким образом отправку ответных ACK-сообщений вместе с данными. В случае интерактивных протоколов, таких как POP, IMAP, SMTP, SSH и FTP, это изменение приведет к заполнению сети лишними пакетами, содержащими лишь ACK-сообщения, и снижению производительности. kern.ipc.maxsockbuf - максимальный размер TCP буфера. kern.ipc.maxsockets - Увеличить максимальное число открытых сокетов во время работы. net.inet.tcp.sendspace - send buffers Буферы для отправки данных. По умолчанию 32K. Если скачиваются данные небольшого объема или недостаток mbuf кластеров можно уменьшить до 16k. net.inet.tcp.recvspace - receive buffers Буферы для приема данных. По умолчанию 64Kб, если нет загрузки больших объемов данных, то можно уменьшить до 8Кб (меньше вероятность переполнения при DoS атаке). net.inet.udp.maxdgram - Maximum outgoing UDP datagram size net.local.stream.recvspace - не помню точно, но что то для оптимизации SAMBA. Впрочем, легко получить описание параметра прямо в консоли: $ sysctl -d net.local.stream.recvspace net.local.stream.recvspace: Default stream receive space. net.local.stream.sendspace - не помню точно, но что то для оптимизации SAMBA. $ sysctl -d net.local.stream.sendspace net.local.stream.sendspace: Default stream send space. kern.ipc.nmbclusters - Увеличение числа mbuf кластеров во FreeBSD последних версий можно произвести в любой момент через данный параметр. TCP/IP ports По умолчанию исходящие соединения инициируются с диапазона портов 49152-65535 (16 тыс.). Их можно увеличить (1024-65535): net.inet.ip.portrange.first=1024 net.inet.ip.portrange.last=65535 Для использования портов по порядку, вместо случайной выборки (для исключения ошибки повторного коннекта с одного порта до отработки TIME_WAIT): net.inet.ip.portrange.randomized=0 Включаем возможность не создания состояния TIME_WAIT для соединений в рамках localhost: net.inet.tcp.nolocaltimewait=1 После изменений в /etc/sysctl.conf: # /etc/rc.d/sysctl restart или перезагрузка.В начале статьи я упоминал о том, что увеличение значений буферов приведет к увеличению потребления оперативной памяти. Привожу текущие значения после нескольких дней работы с вышеуказанными настройками: Кол-во активных подключений - 188 Используется памяти на всё - 260 Мб из 1Гб. Для просмотра значений всех переменных sysctl в системе, введите команду: $ sysctl -a |less Тема достаточно обширная, приведенная конфигурация лишь плод собственных экспериментов и не претендует на что то рекомендуемое. Просто читайте, оптимизируйте систему под требуемые задачи. Вот несколько ссылок очень полезных по этой теме: Sysctl , на OpenNet , пример конфигов . Так же рекомендую к прочтению $ man tuningОхальников Олег aka Hawk!
Просмотров: 7303
|
|||||||
| « FreeBSD $PHP_AUTOCONF *** Error code | FreeBSD8_64 порт mc-4.7.1 и mc-4.7.1_1.tbz » |
|---|
Коментарии (1)
