5.3. 시스템 전체 TCP 소켓 버퍼 증가
시스템 전체 TCP 소켓 버퍼는 커널이 수신하거나 전송할 큐가 있는 데이터를 임시로 저장합니다. net.ipv4.tcp_rmem (read) 및 net.ipv4.tcp_wmem (write) 소켓 버퍼 커널 설정에는 최소, 기본값, 최대값의 세 가지 설정이 포함됩니다.
너무 큰 버퍼 크기를 설정하면 메모리가 낭비됩니다. 각 소켓은 애플리케이션 요청 크기로 설정할 수 있으며 커널은 이 값을 두 배로 늘립니다. 예를 들어, 애플리케이션이 256KiB 소켓 버퍼 크기를 요청하고 1백만 개의 소켓을 여는 경우 시스템은 잠재적인 소켓 버퍼 공간에 대해서만 최대 512GB RAM(512 KiB x 1KiB)을 사용할 수 있습니다.
또한 최대 버퍼 크기에 대한 값이 너무 크면 대기 시간이 증가할 수 있습니다.
사전 요구 사항
- 삭제된 TCP 패킷의 비율이 크게 발생했습니다.
프로세스
연결의 대기 시간을 확인합니다. 예를 들어 클라이언트에서 서버로 ping하여 평균 RTT(Round Trip Time)를 측정합니다.
# ping -c 10 server.example.com ... --- server.example.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 17.208/17.056/19.333/0.616 ms이 예에서 대기 시간은 17ms입니다.
다음 공식을 사용하여 튜닝하려는 트래픽에 대한 BDP(Bandwidth Delay Product)를 계산합니다.
connection speed in bytes * latency in seconds = BDP in bytes예를 들어 17ms 대기 시간이 있는 10Gbps 연결에 대한 BDP를 계산하려면 다음을 수행합니다.
(10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytes요구 사항에 따라
/etc/sysctl.d/10-tcp-socket-buffers.conf파일을 생성하고 최대 읽기 또는 쓰기 버퍼 크기를 설정하거나 둘 다 설정합니다.net.ipv4.tcp_rmem = 4096 262144 42500000 net.ipv4.tcp_wmem = 4096 262144 42500000값을 바이트 단위로 지정합니다. 환경에 최적화된 값을 식별하려는 경우 다음과 같은 지문 규칙을 사용합니다.
-
기본 버퍼 크기(초 값): 이 값을 약간만 늘리거나 최대
524288(512 KiB)으로 설정합니다. 기본 버퍼 크기가 너무 많으면 버퍼 축소가 발생할 수 있으며 결과적으로 대기 시간이 급증할 수 있습니다. - 최대 버퍼 크기(세 번째 값): BDP의 이중에서 3배가 충분한 경우가 많습니다.
-
기본 버퍼 크기(초 값): 이 값을 약간만 늘리거나 최대
/etc/sysctl.d/10-tcp-socket-buffers.conf파일에서 설정을 로드합니다.# sysctl -p /etc/sysctl.d/10-tcp-socket-buffers.confnet.ipv4.tcp_rmem또는net.ipv4.tcp_wmem매개변수에서 두 번째 값을 변경한 경우 애플리케이션을 다시 시작하여 새 TCP 버퍼 크기를 사용합니다.세 번째 값만 변경한 경우 자동 조정이 동적으로 적용되므로 애플리케이션을 다시 시작할 필요가 없습니다.
검증
- 선택 사항: iperf3을 사용하여 TCP 처리량을 테스트합니다.
패킷이 삭제될 때 사용한 것과 동일한 방법을 사용하여 패킷 드롭 통계를 모니터링합니다.
패킷이 계속 감소하지만 더 낮은 속도로 발생하는 경우 버퍼 크기를 더 늘립니다.