34.7. 애플리케이션 읽기 소켓 버퍼 병목 현상 식별
TCP 애플리케이션에서 읽기 소켓 버퍼를 자주 지우지 않으면 성능이 저하될 수 있으며 패킷이 손실될 수 있습니다. Red Hat Enterprise Linux는 이러한 문제를 식별할 수 있는 다양한 유틸리티를 제공합니다.
34.7.1. 수신 버퍼 충돌 및 정리 확인 링크 복사링크가 클립보드에 복사되었습니다!
수신 대기열의 데이터가 수신 버퍼 크기를 초과하면 TCP 스택은 소켓 버퍼에서 불필요한 메타데이터를 제거하여 일부 공간을 확보하려고 합니다. 이 단계를 collapsing이라고 합니다.
충돌 시 추가 트래픽을 위한 충분한 공간을 확보하지 못하는 경우 커널은 도달되는 새 데이터를 정리합니다. 즉, 커널은 메모리에서 데이터를 제거하고 패킷이 손실됩니다.
충돌 및 정리 작업을 방지하려면 서버에서 TCP 버퍼 충돌 및 정리가 발생하는지 여부를 모니터링하고, 이 경우 TCP 버퍼를 튜닝합니다.
절차
nstat
유틸리티를 사용하여TcpExtTCPRcvCollapsed
및TcpExtRcvPruned
카운터를 쿼리합니다.nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned
# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 612859 0.0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 잠시 기다렸다가
nstat
명령을 다시 실행합니다.nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned
# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 620358 0.0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 카운터 값이 첫 번째 실행에 비해 증가한 경우 튜닝이 필요합니다.
-
애플리케이션에서
setsockopt(SO_RCVBUF)
호출을 사용하는 경우 해당 호출을 제거하는 것이 좋습니다. 이 호출을 사용하면 애플리케이션은 호출에 지정된 수신 버퍼 크기만 사용하고 소켓의 크기를 자동으로 조정하는 기능을 끕니다. -
애플리케이션에서
setsockopt(SO_RCVBUF)
호출을 사용하지 않는 경우 TCP 읽기 소켓 버퍼의 기본값 및 최대 값을 조정합니다.
-
애플리케이션에서
수신 백로그 큐 표시(
recv-Q
):Copy to Clipboard Copied! Toggle word wrap Toggle overflow ss -nt
명령을 여러 번 실행하고 각 실행 사이의 대기 시간을 몇 초 동안 실행합니다.출력에
Recv-Q
열에서 높은 값의 경우만 나열되는 경우 애플리케이션은 두 개의 수신 작업 사이에 있었습니다. 그러나Recv-Q
의 값이 일정하게 유지되지만lastrcv
가 지속적으로 증가하거나Recv-Q
가 지속적으로 증가하는 경우 다음 문제 중 하나가 원인일 수 있습니다.- 애플리케이션은 소켓 버퍼를 충분히 자주 확인하지 않습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 애플리케이션 벤더에 문의하십시오.
애플리케이션에 CPU 시간이 충분하지 않습니다. 이 문제를 추가로 디버깅하려면 다음을 수행합니다.
애플리케이션이 실행하는 CPU 코어를 표시합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PSR
열에는 프로세스가 현재 할당된 CPU 코어가 표시됩니다.- 동일한 코어에서 실행 중인 다른 프로세스를 식별하고 다른 코어에 할당하는 것이 좋습니다.