Основной принцип модерации прерываний состоит в том, чтобы генерировать менее одного прерывания на каждый принятый кадр (или одно прерывание на завершение кадра передачи), уменьшая издержки ОС, возникающие при обслуживании прерываний. Контроллер BCM5709 поддерживает несколько аппаратных методов для объединения прерываний, в том числе:
- Генерировать прерывание после получения X-кадров (rx-кадров в ethtool)
- Генерировать прерывание, когда больше кадров не получено после X usecs (rx-usecs в ethtool)
Проблема с использованием этих аппаратных методов заключается в том, что вам нужно выбрать их для оптимизации пропускной способности или задержки, у вас не может быть обоих. Генерация одного прерывания для каждого принятого кадра (rx-frames = 1) минимизирует задержку, но это происходит при высоких затратах с точки зрения издержек на обслуживание прерывания. Установка большего значения (скажем, rx-frames = 10) уменьшает количество циклов ЦП, потребляемых путем генерации только одного прерывания для каждых десяти полученных кадров, но вы также столкнетесь с более высокой задержкой для первых кадров в этой группе из десяти.
Реализация NAPI пытается использовать тот факт, что трафик поступает в виде пакетов, так что вы сразу генерируете прерывание для первого полученного кадра, а затем немедленно переключаетесь в режим опроса (то есть отключаете прерывания), потому что позади будет больше трафика. После того, как вы опросили какое-то количество кадров (16 или 64 в вашем вопросе) или некоторый интервал времени, драйвер снова включит прерывания и начнет заново.
Если у вас прогнозируемая рабочая нагрузка, то можно выбрать фиксированные значения для любого из вышеперечисленных (NAPI, rx-frames, rx-usecs), которые дают вам правильный компромисс, но большинство рабочих нагрузок варьируются, и вы в конечном итоге делаете некоторые жертвы. Это где Adaptive-RX / Adaptive-TX вступают в игру. Идея заключается в том, что драйвер постоянно контролирует рабочую нагрузку (количество кадров в секунду, размер кадра и т. Д.) И настраивает схему объединения аппаратных прерываний для оптимизации задержки в ситуациях с низким трафиком или оптимизации пропускной способности в ситуациях с высоким трафиком. Это классная теория, но ее сложно реализовать на практике. Лишь немногие водители реализовать (см http://fxr.watson.org/fxr/search?v=linux-2.6&string=use_adaptive_rx_coalesce ) и водители bnx2 / E1000 не в этом списке.
Для хорошего описания того, как должно работать каждое объединяющее поле ethtool, взгляните на определения структуры ethtool_coalesce по следующему адресу:
http://fxr.watson.org/fxr/source/include/linux/ethtool.h?v=linux-2.6#L111
Для вашей конкретной ситуации (пропускная способность ~ 400 Мбит / с) я бы предложил настроить значения rx-frames и rx-usecs для наилучших настроек для вашей рабочей нагрузки. Посмотрите как на издержки ISR, так и на чувствительность вашего приложения (httpd? Etc.) к задержке.
Дейв