Решение проблемы с разрывами соединения на контроллере Intel i211.
Вступление.
Дано: Материнская плата 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.