5P by neo 2달전 | favorite | 댓글과 토론

Linux 네트워킹 스택

Linux 네트워크 패킷 수신

  • 네트워크 장치에서 NIC(Network Interface Card)는 패킷이 도착했음을 알리기 위해 IRQ(Interrupt Request)를 발생시킴
  • IRQ 핸들러는 매우 높은 우선순위로 실행되며, 추가 IRQ 생성을 차단함
  • softIRQ 시스템은 장치 드라이버 IRQ 컨텍스트 외부에서 작업을 처리하기 위해 사용됨
  • softIRQ 커널 스레드가 생성되고, softnet_data 구조체가 생성됨
  • NIC는 네트워크 데이터가 RAM의 링 버퍼에 기록되도록 DMA(Direct Memory Access)를 사용함
  • NAPI softIRQ 폴링 루프가 시작됨
  • net_rx_action 루프가 NAPI 구조체를 확인하고, 패킷을 napi_gro_receive로 전달함
  • 패킷은 netif_receive_skb를 통해 프로토콜 스택으로 전달됨

Linux 커널 네트워크 전송

  • 애플리케이션이 메시지를 전송하면 TCP 헤더가 작성되고, L3 핸들러가 호출됨
  • 패킷이 조각화되고, L2 전송 함수가 호출됨
  • 드라이버가 패킷을 tx 링 버퍼에 큐잉함
  • NIC가 RAM에서 패킷을 가져와 전송함
  • 전송이 완료되면 NIC가 하드 IRQ를 발생시킴
  • 드라이버가 이 IRQ를 처리하고, NAPI 폴 시스템을 스케줄링함

네트워크 성능 튜닝

빠른 HOWTO

/proc/net/softnet_stat & /proc/net/sockstat
  • /proc/net/softnet_stat 파일은 각 CPU 코어의 통계를 제공함
  • /proc/net/sockstat 파일은 소켓 사용 통계를 제공함
ss
  • ss는 소켓 통계를 조사하는 유틸리티로, 메모리 사용량을 확인할 수 있음
netstat
  • netstat는 네트워크 연결 및 프로토콜 스택 통계를 제공하는 명령줄 유틸리티임
sysctl
  • sysctl 명령을 사용하여 시스템/네트워크 설정을 변경할 수 있음
  • /etc/sysctl.conf 파일을 편집하여 영구적으로 값을 변경할 수 있음

NIC 링 버퍼

  • NIC 링 버퍼는 고정 크기의 FIFO 버퍼로, RAM에 위치함
  • 버스트 연결을 원활하게 수용하기 위해 이 큐를 증가시킬 필요가 있음

GN⁺의 정리

  • 이 가이드는 Linux 네트워크 스택의 작동 방식을 상세히 설명하며, 네트워크 성능을 최적화하기 위한 다양한 방법을 제시함
  • 네트워크 패킷의 수신 및 전송 과정에서 발생하는 IRQ와 softIRQ의 역할을 이해하는 것이 중요함
  • sysctl 명령을 사용하여 시스템 설정을 조정하고, NIC 링 버퍼의 크기를 조정하여 성능을 향상시킬 수 있음
  • 네트워크 성능 튜닝은 시스템의 특정 요구 사항에 따라 달라질 수 있으며, 다양한 설정을 실험해보는 것이 필요함