FreeBSD для обслуживания 100-200 тысяч соединений (freebsd tcp optimization tune speed socket mbuf sendfile sysctl)
Стенограмма выступления Игоря Сысоева с конференции РИТ-2007.
mbuf clusters
FreeBSD хранит сетевые данные в mbuf clusters, размер каждого 2Кб, но из
них используется только около 1500 байт (по размеру Ethernet пакета).
mbufs
Для каждого mbuf кластера нужен «mbuf», который имеет размер 256 байт и
нужен для организации связи цепочек из mbuf кластеров. В mbuf можно поместить
полезную информацию в районе 100 байт, но это не всегда используется.
Если в машине 1Гб и больше памяти, то по умолчанию будет создано 25 тыс. mbuf кластеров,
что не всегда достаточно.
При ситуации исчерпания числа свободных mbuf кластеров FreeBSD попадает в
состояние zonelimit и перестает отвечать на запросы по сети,
в top это выглядит как «zoneli». Единственная возможность как-то повлиять на
ситуацию – это зайти с локальной консоли и перезагрузить систему, уничтожить
процесс находящийся в состоянии «zoneli» невозможно. Для Linux 2.6.x данная проблема
тоже характерна, причем работать переставала даже консоль.
PID USERNAME THR PRI NICE SIZE RES STATE TIME WCPU COMMAND
13654 nobody 1 4 0 59912K 59484K zoneli 209:26 0.00% nginx
Для выхода из этой ситуации существует патч возвращающий приложению ошибку ENOBUFS,
сигнализирующий о попадании в состояние «zoneli», после чего программа может
закрыть лишние соединения. К сожалению патч пока не принят в состав FreeBSD. Читать далее…