Вопрос или проблема
Я думаю, что понял, почему мой сервер отвечает довольно медленно, из-за bufferbloat.
Я провел некоторые вычисления и выяснил, что мне нужен буфер почти на 4K пакетов (вместо 54K). Но когда я исследовал свою систему, я нашел несколько мест, где могу задать буферы следующим образом:
Определение выходного буфера:
- через ethtool и установку значения TX
- через параметр txqueuelen в ifconfig
Определение входного буфера:
- через ethtool и установку значения RX
- через /proc/sys/net/core/netdev_max_backlog
Я полагаю, что буферы в каждом направлении суммируются, так как пакеты проходят через оба (аппаратный и программный буфер).
Так как моя потребность в буфере невелика, она может поместиться в аппаратный буфер через ethtool.
Лучше ли устанавливать буферы через само оборудование Ethernet, делая программные буферы в Linux действительно маленькими (может быть, от 0 до 100), или лучше сделать аппаратные буферы маленькими, а программные буферы в Linux большими, и почему?
Я задаю этот вопрос, чтобы попытаться сделать так, чтобы мой сервер работал быстрее, не прибегая к разогреву ЦП.
Я также вычислил свои потребности в буферах, исходя из предположения о задержке в 50 мс для подключения к серверу, основываясь на отчете ethtool о том, что скорость соединения составляет 1000 Мбит/с и что MTU равен 1500 байт.
Ответ или решение
Определение правильных значений задержки и буферов в Linux для повышения производительности
Ваша проблема, связанная с медленной реакцией сервера и возможным явлением под названием "bufferbloat", действительно может быть решена путем оптимизации параметров буферов как в аппаратной, так и в программной части. Давайте рассмотрим ключевые аспекты настройки буферов в Linux и как это влияет на производительность вашего сервера.
Понимание Bufferbloat
Bufferbloat — это ситуация, когда слишком большие буферы замедляют передачу пакетов по сети, приводя к высокой задержке и низкому качеству связи. Ваши вычисления показывают, что вам необходимо около 4K буферов для эффективной работы, и удачно, что вы заметили возможность настройки как аппаратных, так и программных буферов.
Настройка выходных (TX) и входных (RX) буферов
Выходные буферы (TX)
-
ethtool: Вы можете настроить выходной буфер с помощью
ethtool
, установив значение TX. Это полезно, так как это значение контролируется на уровне сетевого интерфейса. -
txqueuelen: Параметр
txqueuelen
, задаваемый черезifconfig
, также позволяет управлять длиной очереди для отправки. Меньшие значения могут уменьшить задержки, но важно не установить значение слишком низким, чтобы не привести к потерям пакетов.
Входные буферы (RX)
-
ethtool: Аналогично, RX буферы могут быть настроены также через
ethtool
, устанавливая значение для RX. -
netdev_max_backlog: Этот параметр в
/proc/sys/net/core/netdev_max_backlog
определяет максимальное количество пакетов, ожидающих обработки в очереди. Оптимизация этого параметра может значительно повысить вашу производительность при высокой загруженности.
Оптимизация буферов
Теперь, что касается вашего вопроса о том, стоит ли настраивать аппаратные буферы маленькими и программные большими или наоборот:
-
Аппаратные буферы: В большинстве случаев рекомендуется настроить аппаратные буферы (например, через
ethtool
) на небольшие значения, чтобы избежать задержек, вызванных накоплением пакетов в аппаратной памяти. Это особенно актуально для сценариев с низкой задержкой и малым количеством пакетов. -
Программные буферы: Установка программных буферов на небольшие значения также может способствовать уменьшению задержек, если это правильно сбалансировано. Значение в диапазоне от 0 до 100 действительно может быть рабочим, особенно если ваше подключение к сети стабильное и не испытывает значительной нагрузки.
Балансировка между аппаратными и программными буферами
Так как пакеты проходят через оба типа буферов, важно добиться оптимального баланса. Хотя аппаратные буферы могут быть более эффективными для обработки трафика, программные буферы обеспечивают гибкость в управлении трафиком и могут адаптироваться к изменяющимся условиям сети. Рекомендую провести тесты, измеряя производительность при разных настройках, чтобы определить оптимальные значений для вашей среды.
Заключение
Оптимизация буферов в Linux для уменьшения задержек и повышения производительности вашего сервера — сложный, но выполнимый процесс. Установка правильных значений для аппаратных и программных буферов может значительно снизить эффекты bufferbloat и повысить отзывчивость вашего сервера. Не забывайте также о регулярной проверке производительности после внесения изменений, чтобы убедиться, что ваши настройки действительно приводят к положительным результатам.