6.5. 시스템 전체 UDP 소켓 버퍼 증가
소켓 버퍼는 커널이 수신하거나 전송할 큐가 있는 데이터를 임시로 저장합니다.
다음과 같은 버퍼가 존재합니다.
- 읽기 소켓 버퍼는 커널이 수신했지만 애플리케이션을 아직 읽지 않은 패킷을 보유합니다.
- 쓰기 소켓 버퍼는 애플리케이션이 버퍼에 기록했지만 커널이 아직 IP 스택 및 네트워크 드라이버에 전달되지 않은 패킷을 보유합니다.
UDP 패킷이 너무 커서 버퍼 크기 또는 패킷이 너무 빠른 속도로 전송 또는 수신되는 경우 커널은 데이터가 버퍼에서 제거될 때까지 새로운 들어오는 UDP 패킷을 삭제합니다. 이 경우 소켓 버퍼를 늘리면 패킷 손실을 방지할 수 있습니다.
너무 큰 버퍼 크기를 설정하면 메모리가 낭비됩니다. 각 소켓은 애플리케이션 요청 크기로 설정할 수 있으며 커널은 이 값을 두 배로 늘립니다. 예를 들어, 애플리케이션에서 256KiB 소켓 버퍼 크기를 요청하고 1백만 개의 소켓을 여는 경우 잠재적인 소켓 버퍼 공간에만 512GB RAM(512 KiB x 1 million)이 필요합니다.
사전 요구 사항
- 삭제된 UDP 패킷의 상당한 비율이 발생했습니다.
프로세스
요구 사항에 따라
/etc/sysctl.d/10-udp-socket-buffers.conf파일을 생성하고 최대 읽기 또는 쓰기 버퍼 크기를 설정하거나 둘 다 설정합니다.net.core.rmem_max = 16777216 net.core.wmem_max = 16777216값을 바이트 단위로 지정합니다. 이 예제의 값은 최대 버퍼 크기를 16MiB로 설정합니다. 두 매개변수의 기본값은
212992바이트 (208 KiB)입니다./etc/sysctl.d/10-udp-socket-buffers.conf파일에서 설정을 로드합니다.# sysctl -p /etc/sysctl.d/10-udp-socket-buffers.conf더 큰 소켓 버퍼 크기를 사용하도록 애플리케이션을 구성합니다.
net.core.rmem_max및net.core.wmem_max매개 변수는 애플리케이션의setsockopt()함수에서 요청할 수 있는 최대 버퍼 크기를 정의합니다.setsockopt()함수를 사용하지 않도록 애플리케이션을 구성하는 경우 커널은rmem_default및wmem_default매개변수의 값을 사용합니다.자세한 내용은 애플리케이션 프로그래밍 언어 설명서를 참조하십시오. 애플리케이션 개발자가 아닌 경우 개발자에게 문의하십시오.
- 애플리케이션을 다시 시작하여 새 UDP 버퍼 크기를 사용합니다.
검증
패킷이 삭제될 때 사용한 것과 동일한 방법을 사용하여 패킷 드롭 통계를 모니터링합니다.
패킷이 계속 감소하지만 더 낮은 속도로 발생하는 경우 버퍼 크기를 더 늘립니다.