8.4.2. 소켓 큐
NIC 하드웨어 큐처럼 소켓 큐는
softirq
컨텍스트에서 네트워크 스택으로 채워집니다. 그러면 애플리케이션은 read
, recvfrom
등의 호출을 통해 해당 소켓의 큐를 배출합니다.
이 큐의 상태를 모니터링하려면
netstat
유틸리티를 사용합니다. Recv-Q
칼럼은 큐의 크기를 표시합니다. 일반적으로 소켓 큐에서 오버런은 NIC 하드웨어 버퍼 오버런과 같은 방법으로 관리됩니다 (예: 8.4.1절. “NIC 하드웨어 버퍼 ”).
- 입력 트래픽
- 첫 번째 옵션은 큐가 채워지는 비율을 설정하여 입력 트래픽을 느려지게 합니다. 이렇게 하려면 프레임을 필터링하거나 미리 드롭합니다. NIC의 장치 무게를 낮추어 입력 트래픽을 느려지게할 수 있습니다 [6].
- 큐 깊이
- 큐 깊이를 증가시켜 소켓 큐 오버런을 방지할 수 있습니다. 이렇게 하려면
rmem_default
커널 매개 변수 또는SO_RCVBUF
소켓 옵션의 값 중 하나를 늘립니다. 이에 대한 자세한 내용은 8.2절. “네트워크 설정 최적화 ”에서 참조하십시오. - 애플리케이션 호출 빈도
- 가능하면 자주 호출을 수행하는 애플리케이션을 최적화합니다. 이에는 보다 자주 POSIX 호출 (
recv
,read
)을 수행하기 위해 네트워크 애플리케이션을 수정 또는 재설정하는 것이 포함됩니다. 이렇게하면 애플리케이션이 더 빠르게 큐를 배출할 수 있습니다.
대부분의 관리자에게는 큐의 깊이를 증가하는 것이 바람직한 해결 방법입니다. 이는 가장 간단한 해결 방법이지만 항상 장기적으로 작동하지 않을 수 있습니다. 네트워킹 기술의 속도가 높아지면서 소켓 큐는 더 빠르게 채워질 것입니다. 이는 시간이 지남에 따라 해당 큐의 깊이를 다시 조정하는 것을 의미합니다.
가장 좋은 해결 방법은 애플리케이션 공간에 데이터를 추가하더라도 커널에서 데이터를 더 빠르게 배출하도록 애플리케이션을 강화하거나 설정하는 것입니다. 이렇게 하면 데이터를 필요에 따라 스왑하거나 다시 페이징할 수 있게 되므로 데이터를 보다 유연하게 저장할 수 있습니다.
[6]
장치 무게는
/proc/sys/net/core/dev_weight
를 통해 제어됩니다. 장치 무게와 조정의 의미에 대한 자세한 내용은 8.4.1절. “NIC 하드웨어 버퍼 ”에서 참조하십시오.