Ubuntu 14.04 TCP установил записи хэш-таблицы

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. Если да, то как мне его настроить и сделать так, чтобы он пережил перезагрузку?

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

P.S. Я больше разработчик, чем системный эксперт, поэтому буду признателен за любой подробный ответ :)

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

Настройка ядра

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

Связанный контент