X540-AT2 NIC를 사용하여 Linux 4.4.0에서 실행되는 다중 스레드 서버 응용 프로그램이 있습니다(서버에는 코어당 하나의 스레드가 있음). Linux에는 RSS가 활성화되어 있으므로 시스템의 각 코어는 하나의 NIC 수신 대기열(16개 코어, 즉 16개 RX 대기열)을 사용합니다.
내 목표는 대기열 패킷이 전달되어야 하는 별도의 호스트 "힌트"에서 실행되는 클라이언트 응용 프로그램을 갖는 것입니다(예: 일종의 클라이언트 지정 수신 대기열 로드 밸런싱).
이를 달성하기 위해 나는 성공하지 못한 채 NIC의 흐름 컨트롤러 테이블을 사용해 왔습니다(어떤 아이디어가 있습니까?).
VLAN 태깅: 서버 호스트는 각 VLAN 식별자를 별도의 RX 대기열( 사용
ethtool --config-ntuple
)에 할당하고 클라이언트 애플리케이션은 각 패킷에 VLAN 태그를 할당하여 대상 수신 대기열을 식별합니다(따라서 클라이언트가 방향 균형을 이루기를 원하는 것을 달성함).안타깝게도 서버는 시스템에 할당된 VLAN이 없는 기본 NIC 인터페이스에서 수신 대기 중이므로 클라이언트로부터 패킷을 전혀 수신하지 못합니다. 패킷을 수신한 후 VLAN 태그가 균형 조정 요구에만 사용되도록 삭제하는 방법이 있습니까?
TOS 필드(IPv4 헤더의 비트 8-15): IPv4의 TOS 필드를 사용하여 동일한 작업을 시도했습니다. 서버 호스트는 ethtool을 사용하여 각 TOS 값을 별도의 대기열로 전달하고 클라이언트는 서버에서 원하는 대상 수신 대기열을 기반으로 TOS 값을 갖도록 전송된 패킷을 제작합니다.
불행하게도 ethtool은 필터의 TOS 값을 무시하는 것 같습니다(규칙의 TOS는 항상 0입니다).
$ sudo ethtool -U em2 스트림 유형 tcp4 tos 1 작업 10 ID 2045에 대한 규칙이 추가되었습니다. $ ethtool --show-ntuple em2 16개의 RX 링 사용 가능 총 1개의 규칙 필터: 2045 규칙 유형: IPv4를 통한 TCP 소스 IP 주소: 0.0.0.0 마스크: 255.255.255.255 대상 IP 주소: 0.0.0.0 마스크: 255.255.255.255 TOS: 0x0 마스크: 0xff 소스 포트: 0 마스크: 0xffff 대상 포트: 0 마스크: 0xffff VLAN Ethertype: 0x0 마스크: 0xffff VLAN: 0x0 마스크: 0xffff 사용자 정의: 0x0 마스크: 0xffffffffffffffff 작업: 대기열 10에 직접 입력
user-def: TOS 필드 "문제"를 극복하기 위해 user-def를 사용해 보았지만 마지막 2바이트에서만 사용할 수 있는 것 같습니다.
$ sudo ethtool -U em2 스트림 유형 tcp4 사용자 정의 2 작업 10 ID 2045에 대한 규칙이 추가되었습니다. $ ethtool --show-ntuple em2 16개의 RX 링 사용 가능 총 1개의 규칙 필터: 2045 규칙 유형: IPv4를 통한 TCP 소스 IP 주소: 0.0.0.0 마스크: 255.255.255.255 대상 IP 주소: 0.0.0.0 마스크: 255.255.255.255 TOS: 0x0 마스크: 0xff 소스 포트: 0 마스크: 0xffff 대상 포트: 0 마스크: 0xffff VLAN Ethertype: 0x0 마스크: 0xffff VLAN: 0x0 마스크: 0xffff 사용자 정의: 0x2 마스크: 0xffffffffffffff00 작업: 대기열 10에 직접 입력
다른 바이트를 일치시키려고 하면 무시됩니다(사용자 정의는 항상 0이고 마스크는 가득 찼습니다).
$ sudo ethtool -U em2 스트림 유형 tcp4 사용자 정의 2m 0xf0ffffffffffffff 작업 10 ID 2045에 대한 규칙이 추가되었습니다. $ ethtool --show-ntuple em2 16개의 RX 링 사용 가능 총 1개의 규칙 필터: 2045 규칙 유형: IPv4를 통한 TCP 소스 IP 주소: 0.0.0.0 마스크: 255.255.255.255 대상 IP 주소: 0.0.0.0 마스크: 255.255.255.255 TOS: 0x0 마스크: 0xff 소스 포트: 0 마스크: 0xffff 대상 포트: 0 마스크: 0xffff VLAN Ethertype: 0x0 마스크: 0xffff VLAN: 0x0 마스크: 0xffff 사용자 정의: 0x0 마스크: 0xffffffffffffffff 작업: 대기열 10에 직접 입력
위의 문제를 해결하는 방법을 아시나요? (모든 VLAN 또는 TOS 방법이 저에게 적합합니다).
편집하다: @Hauke Laging의 요청에 따라 질문을 명확히 했습니다.
답변1
균형을 맞추고 싶은 대기열과 달성하려는 효과가 무엇인지 명확해야 합니다.
또한 서버에서 구성할 수 있는 사항도 언급해야 합니다. VLAN을 언급하셨습니다. 서버에서 VLAN을 구성할 수 없는 것 같습니다.
여러 가지 방법으로 동일한 시스템에 패킷을 보낼 수 있는 방법은 여러 가지가 있습니다.
- 다른 TCP/UDP 포트를 사용하십시오(TCP/UDP를 사용하는 경우). 이는 클라이언트와 서버 모두에서 DNAT를 사용하여 애플리케이션에 투명하게 수행될 수 있습니다.
- 서버에서 다른 IP 주소를 사용하십시오. 이는 클라이언트와 서버 모두에서 DNAT를 사용하여 애플리케이션에 투명하게 수행될 수 있습니다.
- 클라이언트와 서버에 다중 터널 인터페이스( )를 생성
ip link add type ipip
하고 다중 인터페이스를 통해 패킷을 보냅니다. - 수신 대기는 ifb 장치 및 트래픽 조절(위의 "정보" 기반)을 사용하여 수행할 수 있습니다.