9장. 수신 대기열 잠금 경합 방지
큐 잠금 경합으로 인해 패킷이 삭제되고 CPU 사용량이 증가할 수 있으므로 대기 시간이 길어집니다. 애플리케이션을 튜닝하고 전송 패킷 셰이핑을 사용하여 수신(RX)에서 큐 잠금 경합을 방지하고 TX(TX) 큐를 전송할 수 있습니다.
9.1. RX 대기열 잠금 경합 방지: SO_REUSEPORT 및 SO_REUSEPORT_BPF 소켓 옵션 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 다중 스레드 네트워크 애플리케이션은 들어오는 트래픽을 수신하려면 연결되지 않은 UDP 또는 TCP 리스너 스레드에 대한 단일 소켓을 공유해야 합니다. 멀티 코어 시스템에서 SO_REUSEPORT 또는 SO_REUSEPORT_BPF 소켓 옵션을 사용하여 로드를 공유하여 애플리케이션의 성능을 향상시킵니다.
단일 소켓을 사용하면 다음과 같은 원인이 됩니다.
- 수신 버퍼에서 상당한 경합으로 인해 패킷이 삭제되고 CPU 사용량이 증가할 수 있습니다.
- CPU 사용량이 크게 증가
- 패킷이 삭제될 수 있음
SO_REUSEPORT 또는 SO_REUSEPORT_BPF 소켓 옵션을 사용하면 한 호스트의 여러 소켓이 동일한 포트에 바인딩할 수 있습니다.
자세한 내용은 시스템의 socket(7) 도움말 페이지 및 /usr/src/debug/kernel- <version> /linux- <version> /tools/testing/selftests/net/reuseport_bpf_cpu.c 파일을 참조하십시오.
Red Hat Enterprise Linux는 커널 소스에서 SO_REUSEPORT 소켓 옵션을 사용하는 방법에 대한 코드 예제를 제공합니다. 코드 예제에 액세스하려면 다음을 수행합니다.
rhel-10-for-x86_64-baseos-debug-rpms리포지토리를 활성화합니다.# subscription-manager repos --enable rhel-10-for-x86_64-baseos-debug-rpmskernel-debuginfo-common-x86_64패키지를 설치합니다.# dnf install kernel-debuginfo-common-x86_64-
코드 예제는
/usr/src/debug/kernel- <version> /linux- <version> /tools/testing/selftests/net/reuseport_bpf_cpu.c파일에서 사용할 수 있습니다.