Меня интересуют конкретные ответы:
- NIC с GRO редактирует / создает TCP ACK или любые другие пакеты (или эта функция прозрачна для стеков TCP получателя / отправителя)?
- Должен быть тайм-аут / событие, когда сетевая карта должна передать «склеенные сегменты» в стек TCP? Кто они такие?
- При настройке пересылки пакетов - функция GRO также пытается прочитать ACK получателя (см. Ниже, почему я спрашиваю это)?
- Любой источник, который объясняет GRO, а также другие функции разгрузки NIC (TSO, LSO ...) лучше, чем справочные страницы Википедии и Linux, был бы очень признателен.
Больше деталей:
Я устраняю проблему производительности с одной реализацией IPSec. Проблема заключается в том, что доступная пропускная способность не распределяется равномерно по всем 4 VPN-туннелям (распределяется примерно как 200 МБ / 200 МБ / с / 1 МБ / / 1 МБ / с; каждый VPN-туннель инкапсулирует одно TCP-соединение). В PCAP время от времени я вижу, что веб-сервер бездействует примерно ~ 2 секунды (в ожидании ACK). Загрузка возобновляется, когда веб-сервер повторно передает неподтвержденные сегменты.
Моя внутренняя сторона PCAP заключается в том, что функция NIC GRO склеивает пакеты, но иногда не передает их в стек TCP своевременно, и это вызывает проблемы.
Поскольку этот VPN-сервер не имеет интерфейсов, которые разрывают TCP-соединения, а только пересылает пакеты. Затем я попытался отключить GRO и после этого заметил, что трафик равномерно распределен по всем туннелям. Кроме того, когда на веб-сервере отключено масштабирование окна TCP, пропускная способность даже распределяется даже при включенном GRO (вот почему у меня возник вопрос № 3).
Я использую 2.6.32-27 Linux на сервере Ubuntu 10.04 (64-разрядная версия). NIC - это Intel 82571EB. Все интерфейсы (HTTP-клиент, VPN-клиент, VPN-сервер, веб-сервер) соединены напрямую в цепочку с кабелями Ethernet 1 Гбит.