У меня есть сервер под управлением Linux (ядро 2.6.18), который резко отбрасывает входящие сетевые пакеты. Я думал, что он страдает от этого, потому что длина очереди приема этого интерфейса слишком мала (по умолчанию 1000). Я хотел увеличить эту очередь, изменив значение /proc/sys/net/core/netdev_max_backlog
(до 3000). Но вроде не сработало. Я погуглил и обнаружил, что кто-то говорит, что это значение применимо только к устройствам, не поддерживающим NAPI, которые, по моему мнению, не относятся к моему устройству, поскольку NAPI был введен с ядра 2.4.20. Я не знал, правда ли это, и обратился к документации ядра, установленной на этом сервере, но этот документ не обновлялся с момента ядра 2.2.
Поэтому мне интересно, правда ли это, и если это так, как я могу изменить длину очереди для устройства NAPI?
Спасибо. Фэн
Наконец, я обнаружил, что интерфейс отбрасывает пакеты, потому что драйвер был настроен со слишком маленьким размером дескриптора Rx, который при работе с объединением прерываний определяет, сколько пакетов драйвер может удерживать, прежде чем он отправит ядру прерывание. Если это значение (отображается с ethtool -g <interface>
) слишком мала, пакеты будут отброшены до того, как можно будет вызвать прерывание. После того, как я увеличил его ethtool -G <interface> Rx <a some big value>
, с тех пор никакого помета не возникало.
Спасибо всем.
На выходе ethtool -g
вы получите «Предустановленные максимумы» и «Текущие настройки оборудования» вашей сетевой карты. Всегда следует рекомендовать устанавливать ваши настройки на максимально допустимое значение, чтобы избежать отбрасывания пакетов, но более конкретно: ошибок rx или переполнения (что может произойти, например, в случае пакета).
Даже в некоторых случаях есть обновления драйверов, которые могут увеличивать «предустановленные максимальные значения» сетевой карты, конечно, все зависит от модели.