해결하려는 문제: Link Bandwidth가 어마어마하게 증가하는 요즘(+100Gbps) , Linux Network Stack에서 Overhead는 어디서 나올까??
참고자료: 리눅스 Network Stack Data Path

End-to-End Datapath
- Sender는 write 시스템콜 실행
- (이제부터 커널) socket buffer initialization
- TCP/IP Layer 에서 프로세싱
- Netfilter : Linux kernel framework, callback function들 register
- XPS : transmit side traffic steering (CPU map 또는 receive queue map 사용)
- Queueing Discipline :
qdisc
통해 shaped. Rate limiting, FIFO, priority - GSO : MTU size chunk로 나눠짐
- Driver TX enqueue
- (커널끝) 패브릭 타고 이동~
- (리시버 하드웨어) DMA to kernel memory
- DCA 사용하면 바로 LLC 로 카피
- NIC는 Interrupt Request (IRQ) 만듦. 이거 듣고 드라이버가 처리
- NAPI pooling 트리거, 적당한 프레임 pool (batch로 하면 좀 더 최적화 가능)
- GRO(Generic Receive Offload)/LRO(Large Receiver Offload) 통해 패킷들 Merge
- RPS(Receive Packet Steering) / RFS(Receive Flow Steering)
- Netfilter : 콜백 아마도 실행
- TCP/IP Layer
- Receiver Queue에 추가
- read 시스템 콜
접근한 방법:
- Single Core만으로는 병목 생기는 거 보여주기
모든 optimization 켜도 생김 (TSO/GRO Jumbo aRFS) - 그 중, Receiver Side에서 부하가 많이 생김 -> 병목
1) 크게 Data copy 와skb
( socket buffer) allocation에서 생김
2) aRFS 꺼져있을 때