Постоянные сетевые настройки Ubuntu Server 22.04

Вопрос или проблема

У меня установлена 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/

Для того чтобы настройки были постоянными, вы можете создать скрипт, который будет автоматически выполняться при поднятии сетевого интерфейса. Это можно сделать следующим образом:

  1. Создание сценария: Создайте новый файл в директории /etc/network/if-up.d/. Например, назовите его ethtool-ring-set-rx-tx-max.

    sudo nano /etc/network/if-up.d/ethtool-ring-set-rx-tx-max
  2. Добавление содержимого: Вставьте следующий код в файл:

    #!/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 $?
  3. Настройка разрешений: После сохранения файла, установите корректные разрешения и владельца:

    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.

Оцените материал
Добавить комментарий

Капча загружается...