Understanding Host Network Stack Overheads - SIGCOMM '21

해결하려는 문제: Link Bandwidth가 어마어마하게 증가하는 요즘(+100Gbps) , Linux Network Stack에서 Overhead는 어디서 나올까??

참고자료: 리눅스 Network Stack Data Path

End-to-End Datapath

  1. Sender는 write 시스템콜 실행
  2. (이제부터 커널) socket buffer initialization
  3. TCP/IP Layer 에서 프로세싱
  4. Netfilter : Linux kernel framework, callback function들 register
  5. XPS : transmit side traffic steering (CPU map 또는 receive queue map 사용)
  6. Queueing Discipline : qdisc 통해 shaped. Rate limiting, FIFO, priority
  7. GSO : MTU size chunk로 나눠짐
  8. Driver TX enqueue
  9. (커널끝) 패브릭 타고 이동~
  10. (리시버 하드웨어) DMA to kernel memory
  11. DCA 사용하면 바로 LLC 로 카피
  12. NIC는 Interrupt Request (IRQ) 만듦. 이거 듣고 드라이버가 처리
  13. NAPI pooling 트리거, 적당한 프레임 pool (batch로 하면 좀 더 최적화 가능)
  14. GRO(Generic Receive Offload)/LRO(Large Receiver Offload) 통해 패킷들 Merge
  15. RPS(Receive Packet Steering) / RFS(Receive Flow Steering)
  16. Netfilter : 콜백 아마도 실행
  17. TCP/IP Layer
  18. Receiver Queue에 추가
  19. read 시스템 콜

접근한 방법:

  1. Single Core만으로는 병목 생기는 거 보여주기‌‌‌‌
    모든 optimization 켜도 생김 (TSO/GRO Jumbo aRFS)
  2. 그 중, Receiver Side에서 부하가 많이 생김 -> 병목
    1) 크게 Data copy 와 skb( socket buffer) allocation에서 생김
    2) aRFS 꺼져있을 때