Мене цікавлять конкретні відповіді:
- Чи редактор NIC з GRO редагує / створює TCP ACK або будь-які інші пакети (чи ця функція прозора для TCP стеків приймача / відправника)?
- Повинно бути час / подія, коли NIC повинен передати "склеєні сегменти" до стеку TCP? Хто вони?
- У налаштуваннях переадресації пакетів - чи функція GRO також намагається прочитати ACK приймачів (див. Нижче, чому я це запитую)?
- Будь-яке джерело, яке пояснює GRO, а також інші функції розвантаження NIC (TSO, LSO ...), які краще, ніж вікіпедії та користувацькі сторінки Linux, було б дуже вдячне.
Детальніше:
Я вирішую проблему продуктивності однієї програми IPSec. Проблема полягає в тому, що наявна пропускна здатність не рівномірно розподіляється по всіх 4 тунелях VPN (розподіляється приблизно як 200MBps / 200MBps / 1MBps / 1MBps; Кожен тунель 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, веб-сервер) з'єднані безпосередньо ланцюжком з 1 Гбіт Ethernet-кабелями.