Решение проблемы с разрывами соединения на контроллере Intel i211.

24. декабря 2022 Linux 0

Вступление.

Дано: Материнская плата Asus Prime x370-Pro с сетевым контроллером Intel i211.

Контроллер считается довольно проблемным и с этим остаётся только согласиться. С имеющимся экземпляром чуда не случилось, что вылилось в непосредственное столкновение с одной из проблем.

Симптомы: Соединение работает очень нестабильно (регулярно разрывается), особенно интенсивно в том случае, когда скорость приёма-передачи становится свыше 10 Мбит/сек.

Были мысли, что загвоздка может крыться в ядерном драйвере igb, который в ядре Linux представлен с довольно усечённым набором опций, но сборка с расширенным набором опций не решила проблему. Самую свежую версию драйвера можно найти здесь: https://sourceforge.net/projects/e1000/files/

Так же было опробовано эрзац-решение с ограничением скорости передачи пакетов. Кроме очевидной большой потери скорости (до 10 раз относительно возможностей контроллера и канала), это довольно ненадёжное решение — разрывы соединения всё равно случались время от времени.

Изыскания были продолжены.

Решение.

В ходе экспериментов было обнаружено, что разрывы соединения прекратились в режиме полудуплекса (half duplex) и с включенным согласованием (autoneg). Решение проблемы было реализовано с использованием утилиты ethtool.

Пример команды на включение полудуплекса и согласования в режиме пропускной способности 100 Мб для сетевого интерфейса с именем ens1:

sudo ethtool -s ens1 speed 100 duplex half autoneg on

-s — параметр принимает имя сетевого интерфейса. В зависимости от системы имя сетевого интерфейса будет отличаться. Для точного определения имени в конкретном случае можно использовать команду ip link.

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

Создать скрипт, который будет применять команду сразу, как система начнёт пытаться установить соединение с сетью. При использовании NetworkManager это можно сделать через обычный скрипт, размещённый в /etc/NetworkManager/dispatcher.d/pre-up.d/.

Создать файл скрипта с именем 99-ethtool (может быть любое):

sudo touch /etc/NetworkManager/dispatcher.d/pre-up.d/99-ethtool

Файлом обязательно должен владеть суперпользователь (root) и иметь возможность его выполнить:

sudo chown root:root /etc/NetworkManager/dispatcher.d/pre-up.d/99-ethtool
sudo chmod 700 /etc/NetworkManager/dispatcher.d/pre-up.d/99-ethtool

Узнать имя сетевого интерфейса, для которого будет применяться команда и решать проблему с разрывами соединения:

ip link

Теперь необходимо отредактировать файл и внести команду. Пример с использованием текстового редактора nano:

sudo nano /etc/NetworkManager/dispatcher.d/pre-up.d/99-ethtool

Внести следующее содержимое:

#!/usr/bin/env bash
/usr/sbin/ethtool -s ens1 speed 100 duplex half autoneg on

Сохранить изменения и перезапустить NetworkManager для переподключения соединений и применения изменений:

sudo systemctl restart NetworkManager

Теперь команда будет применяться перед каждым подключением к сети для указанного сетевого интерфейса, что полностью решит проблему с нестабильной работой контроллера Intel i211.


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

Ваш адрес email не будет опубликован. Обязательные поля помечены *