Вопрос или проблема
У меня установлена Ubuntu 22.04. Я постоянно получал предупреждения о потерянных пакетах от Netdata. После выполнения;
ethtool -g eno1
Параметры кольца для eno1:
Предустановленные максимумы:
RX: 4096
RX Mini: n/a
RX Jumbo: n/a
TX: 4096
Текущие аппаратные настройки:
RX: 256
RX Mini: n/a
RX Jumbo: n/a
TX: 256
Я изменил сетевые настройки с помощью;
sudo ethtool -G eno1 rx 4096 && sudo ethtool -G eno1 tx 4096
Похоже, что это решило проблему, но ethtool
не сохраняется после перезагрузки. Я не могу найти файл Ubuntu 22.04, который мне нужно изменить, чтобы сделать изменения постоянными.
Пожалуйста, подскажите
Я решил эту проблему, используя функциональность Network Manager Dispatcher. Этот сервис позволяет запускать скрипт при возникновении сетевых событий. Мы можем добавить скрипт, который проверяет настройки кольцевого буфера, когда интерфейс становится “активным” и выполняет команду для установки буферов RX и TX на максимум, если это необходимо.
Чтобы протестировать это, скопируйте скрипт 99-ringconf в расположение:
/etc/NetworkManager/dispatcher.d
Убедитесь, что файл имеет правильное владение и разрешения:
sudo chown root:root /etc/NetworkManager/dispatcher.d/99-ringconf
sudo chmod 755 /etc/NetworkManager/dispatcher.d/99-ringconf
Теперь перезагрузите для проверки сохранения. Лог строки также находятся в:
/var/log/syslog
для проверки работы скрипта.
На моем компьютере с Ubuntu 24.04.1 LTS, найдено с помощью команды:
lsb_release -a
Мне пришлось немного изменить ранее связанный скрипт, чтобы он мог выполнять конфигурацию сети (я не использую NetworkManager). Я не хотел изменять его сильно, поэтому оригинальный скрипт, включая исправление ошибки, обернут в функцию, которая затем вызывается внизу. Этот скрипт должен быть сохранен как файл в /etc/network/if-up.d/
. Я решил назвать свой в соответствии с тем, что он, кажется, делает.
/etc/network/if-up.d/ethtool-ring-set-rx-tx-max
Из-за моего изменения (см. конец этого скрипта), команда ifup будет инициировать изменение.
Примечание это произойдет для каждой сетевой карты. Вам нужно будет внести некоторые изменения, чтобы сделать так, чтобы этот скрипт применялся избирательно.
#!/bin/sh -e
# Скрипт для настройки RX и TX кольцевого буфера на максимум.
#
update_rx_tx_ring_buffer_to_max() {
if [ -z "$1" ]; then
echo "$0: вызван без параметра интерфейса" 1>&2
return 1;
fi
if [ "$2" = "up" ]; then
logger -s "интерфейс $1 сейчас активен, получаем текущие размеры кольцевого буфера"
#Проверка, существует ли команда ethtool и поддерживает ли интерфейс кольцевые буфера
ethtool -g $1 > /dev/null
result=$?
if [ ${result} -ne 0 ]; then
logger -s "Интерфейс не поддерживает кольцевой буфер или ethtool не установлен?"
return 2;
fi
#настройка через ethtool
ethtool_params=$(ethtool -g $1)
max_rx_ring=$(echo "${ethtool_params}" | grep -A4 'Предустановленные максимумы'| grep 'RX:' | sed -n "s/^RX:\s*\([0-9]*\)$/\1/p")
cur_rx_ring=$(echo "${ethtool_params}" | grep -A4 'Текущие аппаратные настройки'| grep 'RX:' | sed -n "s/^RX:\s*\([0-9]*\)$/\1/p")
max_tx_ring=$(echo "${ethtool_params}" | grep -A4 'Предустановленные максимумы'| grep 'TX:' | sed -n "s/^TX:\s*\([0-9]*\)$/\1/p")
cur_tx_ring=$(echo "${ethtool_params}" | grep -A4 'Текущие аппаратные настройки'| grep 'TX:' | sed -n "s/^TX:\s*\([0-9]*\)$/\1/p")
logger -s "интерфейс $1 Текущий RX:${cur_rx_ring}/TX:${cur_tx_ring}, Максимально поддерживаемые значения RX:${max_rx_ring}/TX:${max_tx_ring}"
#проверка, если RX max > текущего
if [ "${cur_rx_ring}" -lt "${max_rx_ring}" ]; then
#увеличение значения RX кольца
logger -s "Увеличение RX кольца для $1 с ${cur_rx_ring} до ${max_rx_ring}"
ethtool -G $1 rx ${max_rx_ring}
else
logger -s "действие не предпринято, так как текущий кольцевой буфер RX уже на максимуме"
fi
#проверка, если TX max > текущего
if [ "${cur_tx_ring}" -lt "${max_tx_ring}" ]; then
#увеличение значения TX кольца
logger -s "Увеличение TX кольца для $1 с ${cur_tx_ring} до ${max_tx_ring}"
ethtool -G $1 tx ${max_tx_ring}
else
logger -s "действие не предпринято, так как текущий кольцевой буфер TX уже на максимуме"
fi
echo done
return 0;
fi
}
eth_if=""
if [ $# -eq 0 ] ; then
# используйте значение в настройках окружения (обычно так и есть)
eth_if="${IFACE}"
else
eth_if="$1"
fi
# up требуется, потому что этот скрипт изначально был для другой части linux, где флаг мог быть активным или неактивным
update_rx_tx_ring_buffer_to_max $eth_if up
exit $?
Ответ или решение
Устойчивые сетевые настройки в Ubuntu Server 22.04
При работе с Ubuntu Server 22.04 и возникновении проблемы с потерей пакетов, как у вас, важно не только решить проблему, но и обеспечить её постоянное исправление после перезагрузок системы. Одним из решений, которое вы упомянули, является использование функциональности диспетчера NetworkManager. Тем не менее, если вы не используете NetworkManager, представим альтернативный подход для настройки сетевых параметров, который будет устойчив к перезагрузкам.
1. Проблема с потерей пакетов
Как вы уже заметили, использование команды ethtool
для изменения параметров колец RX и TX решает проблему потери пакетов. Однако, изменения, выполненные с помощью ethtool
, являются временными и сбрасываются после перезагрузки.
2. Использование сценария в /etc/network/if-up.d/
Для того чтобы настройки были постоянными, вы можете создать скрипт, который будет автоматически выполняться при поднятии сетевого интерфейса. Это можно сделать следующим образом:
-
Создание сценария: Создайте новый файл в директории
/etc/network/if-up.d/
. Например, назовите егоethtool-ring-set-rx-tx-max
.sudo nano /etc/network/if-up.d/ethtool-ring-set-rx-tx-max
-
Добавление содержимого: Вставьте следующий код в файл:
#!/bin/sh -e # Скрипт для настройки RX и TX кольцевых буферов на максимальные значения. update_rx_tx_ring_buffer_to_max() { if [ -z "$1" ]; then echo "$0: вызван без параметра интерфейса" 1>&2 return 1; fi if [ "$2" = "up" ]; then logger -s "интерфейс $1 теперь активен, получаем текущие размеры кольцевых буферов" # Проверяем наличие команды ethtool и поддержку кольцевых буферов интерфейсом ethtool -g $1 > /dev/null result=$? if [ ${result} -ne 0 ]; then logger -s "Интерфейс не поддерживает кольцевые буферы или ethtool не установлен?" return 2; fi # Настройка через ethtool ethtool_params=$(ethtool -g $1) max_rx_ring=$(echo "${ethtool_params}" | grep -A4 'Предустановленные максимумы'| grep 'RX:' | sed -n "s/^RX:\s*\([0-9]*\)$/\1/p") cur_rx_ring=$(echo "${ethtool_params}" | grep -A4 'Текущие аппаратные настройки'| grep 'RX:' | sed -n "s/^RX:\s*\([0-9]*\)$/\1/p") max_tx_ring=$(echo "${ethtool_params}" | grep -A4 'Предустановленные максимумы'| grep 'TX:' | sed -n "s/^TX:\s*\([0-9]*\)$/\1/p") cur_tx_ring=$(echo "${ethtool_params}" | grep -A4 'Текущие аппаратные настройки'| grep 'TX:' | sed -n "s/^TX:\s*\([0-9]*\)$/\1/p") logger -s "интерфейс $1: текущие RG:${cur_rx_ring}/TX:${cur_tx_ring}, Максимально поддерживаемые значения RX:${max_rx_ring}/TX:${max_tx_ring}" # Проверяем и увеличиваем RX if [ "${cur_rx_ring}" -lt "${max_rx_ring}" ]; then logger -s "Увеличиваем RX-багет для $1 с ${cur_rx_ring} до ${max_rx_ring}" ethtool -G $1 rx ${max_rx_ring} fi # Проверяем и увеличиваем TX if [ "${cur_tx_ring}" -lt "${max_tx_ring}" ]; then logger -s "Увеличиваем TX-багет для $1 с ${cur_tx_ring} до ${max_tx_ring}" ethtool -G $1 tx ${max_tx_ring} fi echo done return 0; fi } eth_if="" if [ $# -eq 0 ] ; then eth_if="${IFACE}" else eth_if="$1" fi update_rx_tx_ring_buffer_to_max $eth_if up exit $?
-
Настройка разрешений: После сохранения файла, установите корректные разрешения и владельца:
sudo chown root:root /etc/network/if-up.d/ethtool-ring-set-rx-tx-max sudo chmod 755 /etc/network/if-up.d/ethtool-ring-set-rx-tx-max
3. Проверка работоспособности
Перезагрузите систему и проверьте, работает ли скрипт как ожидалось. Вы можете просмотреть логи в файле /var/log/syslog
, чтобы убедиться в выполнении вашего сценария.
Заключение
Теперь у вас есть устойчивое решение для настройки сетевых параметров, которое будет работать каждый раз, когда происходит поднятие интерфейса. Это решение не зависит от использования NetworkManager, что делает его универсальным для различных конфигураций сетей на Ubuntu Server 22.04.