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 링 버퍼의 크기를 조정하여 성능을 향상시킬 수 있음
- 네트워크 성능 튜닝은 시스템의 특정 요구 사항에 따라 달라질 수 있으며, 다양한 설정을 실험해보는 것이 필요함