8.4. 일반적인 큐/프레임 손실 문제 해결
지금까지 프레임 손실의 가장 일반적인 이유는 큐 오버런 (queue overrun)입니다. 커널은 큐의 길이에 제한을 설정하고 있기 때문에 경우에 따라서는 큐의 배출보다 더 빨리 채워집니다. 이 현상이 오래 지속되면 프레임 드롭이 시작됩니다.
그림 8.1. “네트워크 수신 경로 다이어그램 ”에서 보여주듯이, 수신 경로에는 NIC 하드웨어 버퍼와 소켓 큐라는 두 가지 주요 큐가 있습니다. 두 큐 모두는 큐 오버런을 방지하기 위해 적절하게 설정해야 합니다.
8.4.1. NIC 하드웨어 버퍼
NIC는 프레임으로 하드웨어 버퍼를 채웁니다. 다음으로 버퍼는 인터럽트를 통해 NIC가 주장하는
softirq
에 의해 배출됩니다. 큐의 상태를 확인하려면 다음과 같은 명령을 사용합니다:
ethtool -S ethX
ethX
를 NIC의 해당 장치 이름으로 대체합니다. 이는 ethX
내에서 얼마나 많은 프레임이 드롭되었는지를 표시합니다. 드롭이 발생하는 대부분의 이유는 큐가 프레임을 저장할 버퍼 공간이 부족하기 때문입니다.
이러한 문제를 해결하려면 다음과 같은 여러가지 방법이 있습니다:
- 입력 트래픽
- 입력 트래픽을 느리게하여 큐 오버런을 방지할 수 있습니다. 이는 통합된 멀티캐스트 그룹의 수를 필터링하여 줄이고 브로드 캐스트 트래픽을 감소시켜 달성할 수 있습니다.
- 큐 길이
- 다른 방법으로 큐의 길이를 늘릴 수 있습니다. 이는 드라이버가 허용하는 최대 값 까지 지정된 큐에 있는 버퍼 수를 늘리는 것입니다. 이를 위해 다음과 같이
ethX
의rx
/tx
링 매개변수를 편집합니다:ethtool --set-ring ethX
앞서 언급한 명령에 해당rx
또는tx
값을 추가합니다. 보다 자세한 내용은man ethtool
에서 참조하십시오. - 장치 무게
- 큐가 배출되는 속도를 높일 수 있습니다. 이를 위해 NIC의 장치 무게 (device weight)를 적절하게 조정합니다. 이 속성은
softirq
컨텍스트가 CPU를 포기하고 자체 일정을 변경하기 전 NIC가 받을 수 있는 최대 프레임 수를 말합니다. 이는/proc/sys/net/core/dev_weight
변수에 의해 제어됩니다.
대부분의 관리자는 세 번째 옵션을 선택하는 경향이 있습니다. 하지만 이 옵션을 실행하면 그에 따른 결과가 수반된다는 점에 유의하십시오. 한 번의 반복에서 NIC에서 수신할 수 있는 프레임 수를 늘리면 CPU 사이클이 증가하게 되어, 해당 CPU에서 애플리케이션을 스케줄할 수 없습니다.