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.

Итак, вот мои вопросы:

  1. Является ли эта таблица соединений tcp источником моей проблемы? или я должен искать где-то еще?
  2. Если это так, то как я могу установить его и заставить пережить перезагрузку?

Заранее благодарим за любую помощь, и не стесняйтесь спрашивать меня, если вам нужна дополнительная помощь.

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 чтобы помочь в дальнейшем устранении неполадок.

Тюнинг Ядро

Руководство по администрированию высокопроизводительных вычислений

Другие вопросы по тегам