Ubuntu 14.04 TCP установил записи хеш-таблицы
Немного фона
Я использую два сервера с высоким трафиком, один с Ubuntu 12.04 (linux 3.2.0-69-generic) и один с Ubuntu 14.04 (linux 3.13.0-52-generic). Я сейчас пытаюсь обеспечить оба. Они оба имеют очень похожие аппаратные ресурсы (такое же количество CPUS, но 12.04 имеет только 8 ГБ ОЗУ, когда 14.04 получил 16 ГБ).
Я хотел включить брандмауэр ufw, но столкнулся с некоторыми проблемами при заполнении таблицы nf_conntrack. Пакеты были отброшены в основном.
Я нашел решение для них, сократив время ожидания и увеличив размер таблицы, а также количество сегментов. То есть:
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_max = 196608
net.netfilter.nf_conntrack_buckets = 24576
Эти значения корректно обновляются и переживают перезагрузку. (См. Этот блог). Я также вижу, что значение conntrack_count значительно выше значения по умолчанию, поэтому я уверен, что это работает на обоих серверах. Значения остаются в рамках ограничений, поэтому я уверен, что все в порядке.
Проблема
Сервер 12.04 отлично работает при высокой нагрузке, но 14.04 продолжает сбрасывать пакеты, создавая тайм-ауты клиента. Теперь при загрузке 14.04 я вижу эту строку в kern.log:
TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
В то время как 12.04, это:
TCP established hash table entries: 524288 (order: 11, 8388608 bytes)
Я подозреваю, что это может быть причиной того, что мой сервер отбрасывает пакет, так как эта таблица может быть слишком мала относительно объема трафика на 14.04.
Поэтому я попытался найти способ установить этот размер и нашел параметр thash_entries, см. Здесь для объяснения). Однако я не могу установить его с помощью sysctl.
Итак, вот мои вопросы:
- Является ли эта таблица соединений tcp источником моей проблемы? или я должен искать где-то еще?
- Если это так, то как я могу установить его и заставить пережить перезагрузку?
Заранее благодарим за любую помощь, и не стесняйтесь спрашивать меня, если вам нужна дополнительная помощь.
PS Я скорее разработчик, чем системный эксперт, поэтому буду признателен за любой подробный ответ:)
1 ответ
Настройка ядра Linux для высокой пропускной способности сети - это искусство, основанное на балансе.
Увеличение таблицы отслеживания подключений - это хорошо, но это означает, что потенциально может использоваться больше сокетов, а это, в свою очередь, означает, что системе нужно больше дескрипторов файлов, и колесо продолжает работать...
В вашем случае я бы начал со следующих настроек ядра:
net.core.somaxconn
а также
fs.file-max
Первый определяет количество открытых сокетов, которые выдержит ядро. Второй используется для установки количества используемых дескрипторов файлов, которые будут поддерживаться ядром.
Тогда есть отставание SYN, которое может быть доработано.
net.ipv4.tcp_max_syn_backlog
Устанавливает количество соединения, которое может быть в ожидании подтверждения от вашего сервера.
net.ipv4.tcp_syncookies
Для работы журнала SYN Backlog необходимо включить файлы cookie TCP SYN.
Наконец, есть несколько настроек, например, возможность повторного использования соединения TIME_WAIT.
net.ipv4.tcp_tw_reuse
Это может потенциально уменьшить количество "новых" сокетов, которые будут открываться при получении шипа.
Это всего лишь вершина айсберга, мой опыт работы с большими объемами Linux/Unix-систем заключается в том, что вы настроите их на пару месяцев, прежде чем получите правильный баланс.
Убедитесь, что вы смотрите на ошибки в /var/log/kern.log
а также /var/log/messages
чтобы помочь в дальнейшем устранении неполадок.
Руководство по администрированию высокопроизводительных вычислений