Это множество мелких причин, которые в сумме приводят к тому, что беспроводная сеть работает медленнее заявленной скорости. Ars Technica недавно опубликовала очень хорошую статью о том, почему реальные -скорости жизни никогда не соответствуют обещанным, и я постараюсь изложить ее в нескольких кратких пунктах. Я все же рекомендую вам прочитать статью целиком, автор намного более осведомлен и опытен, чем я.
Во-первых, сетевые устройства могут работать только на максимальной скорости самого медленного устройства, что в вашем случае составляет 300 Мбит/с беспроводной карты ноутбука. Но это максимальная теоретическая пропускная способность, которая не включает накладные расходы , такие вещи, как отброшенные пакеты, заголовки и случайные ожидания, чтобы гарантировать отсутствие коллизий пакетов в канале. Ваша Wi-Fi-карта на 300 Мбит/с на самом деле представляет собой два MIMO-потока по 150 Мбит/с, которые имеют реальную пропускную способность~42 Мбит/с каждый из-за накладных расходов на канале. Два канала по 42 это 84 мбит/с, но вайфай тоже полудуплекс , а это значит, что нельзя передавать или принимать одновременно. Это связано с тем, что весь канал является единым доменом коллизий , что означает, что для предотвращения потери пакетов только одно устройство может обмениваться данными по каналу в данный момент времени, даже устройства, которые не находятся в вашей сети, но находятся в тот же канал должен подчиняться этому.
Таким образом, реальная пропускная способность снижается до ~42 Мбит/с. ~Скорость 42 Мбит/с не соответствует никакому стандарту пропускной способности, поэтому я предполагаю, что ваша операционная система округляет это значение до ближайшего известного ей стандарта (не цитируйте меня в этой части ), что так вы получите 52 Мбит/с на интерфейсе 300 Мбит/с.
Собственный способ systemd для установки параметров — с помощью .link
файла (см. справочную страницу systemd.link , однако в настоящее время у него нет способа установить параметры кольцевого буфера. Так что, насколько мне известно, нет собственного системного способа сделать это. Это изменится, когда будет выпущен новый systemd с запросом функции Wildcard с параметрами RxBufferSize
и TxBufferSize
.
Если вы на самом деле используете /etc/network/interfaces
для настройки, просто введите там команду pre-up
. Это было бы моим предпочтением вместо того, чтобы возиться с systemd -networkd.
Вы можете настроить некоторые правила udev для соответствия устройству, когда оно появится, и запустить там ethtool. Это должно выполняться до того, как systemd будет проинформирован об устройстве (и до того, как он что-либо сделает с ним ).
Вы можете настроить службу systemd (типа oneshot, просто запустив ethtool )до того, как какая-либо служба установит ваше связывающее устройство, и после того, как устройство появится, и используйте это. systemd производит .device
модулей для Ethernet-устройств; используйте systemctl list-units | grep sys-subsystem-net
, чтобы найти правильный (, чтобы вы могли сделать свою услугу Хочет/После этого ).
Вот правило udev, которое работает в Ubuntu 18:
ACTION=="add|change", SUBSYSTEM=="net", KERNEL=="eth*|en*", RUN+="/sbin/ethtool -G $name rx 4096 tx 4096"
Поместите это в /etc/udev/rules.d/59-net.ring.rules
, и оно вступит в силу на ранней стадии процесса загрузки.