특정 답변에 관심이 있습니다.
- GRO가있는 NIC가 TCP ACK 또는 다른 패킷을 편집 / 생성합니까 (또는이 기능이 수신자 / 전송자 TCP 스택에 투명합니까?)?
- NIC가 "접착 된 세그먼트"를 TCP 스택으로 전달해야하는 시간 초과 / 이벤트가 있어야합니까? 그들은 무엇인가?
- 패킷 포워딩 설정에서 GRO 기능은 수신기 ACK를 읽으려고 시도합니까 (이를 묻는 이유는 아래 참조)?
- Wikipedia 및 Linux 매뉴얼 페이지보다 GRO 및 기타 NIC 오프 로딩 기능 (TSO, LSO ...)을 설명하는 모든 소스가 정말 좋습니다.
자세한 내용은:
하나의 IPSec 구현으로 성능 문제를 해결하고 있습니다. 문제는 사용 가능한 대역폭이 모든 4 개의 VPN 터널에 균등하게 분배되지 않는다는 것입니다 (약 200MBps / 200MBps / 1MBps / 1MBps로 분배됩니다. 각 VPN 터널은 단일 TCP 연결을 캡슐화합니다). PCAP에서 가끔 웹 서버가 ~ 2 초 동안 유휴 상태임을 알 수 있습니다 (ACK 대기 중). 웹 서버가 승인되지 않은 세그먼트를 재전송하면 다운로드가 다시 시작됩니다.
PCAP에서 필자가 빠뜨린 것은 NIC GRO 기능이 패킷을 서로 접착하지만 때로는 적시에 TCP 스택으로 전달하지 않아 문제가 발생한다는 것입니다.
이 VPN 서버에는 TCP 연결을 종료하는 인터페이스가 없지만 패킷 만 전달합니다. 그런 다음 GRO를 비활성화하려고 시도한 후 트래픽이 모든 터널에 균등하게 분배되는 것을 관찰했습니다. 또한 웹 서버에서 TCP 창 스케일링을 비활성화하면 GRO를 활성화해도 대역폭이 분산됩니다 (따라서 질문 # 3이 발생했습니다).
Ubuntu 10.04 서버 (64 비트)에서 2.6.32-27 Linux를 사용하고 있습니다. NIC는 인텔 82571EB입니다. 모든 인터페이스 (HTTP 클라이언트, VPN 클라이언트, VPN 서버, 웹 서버)는 1Gbit 이더넷 케이블과 체인으로 직접 연결됩니다.