31.7. 애플리케이션 읽기 소켓 버퍼 병목 현상 식별
TCP 애플리케이션에서 읽기 소켓 버퍼를 자주 지우지 않으면 성능이 저하될 수 있으며 패킷이 손실될 수 있습니다. Red Hat Enterprise Linux는 이러한 문제를 식별할 수 있는 다양한 유틸리티를 제공합니다.
31.7.1. 수신 버퍼 충돌 및 정리 확인
수신 대기열의 데이터가 수신 버퍼 크기를 초과하면 TCP 스택은 소켓 버퍼에서 불필요한 메타데이터를 제거하여 일부 공간을 확보하려고 합니다. 이 단계를 collapsing이라고 합니다.
충돌 시 추가 트래픽을 위한 충분한 공간을 확보하지 못하는 경우 커널은 도달되는 새 데이터를 정리합니다. 즉, 커널은 메모리에서 데이터를 제거하고 패킷이 손실됩니다.
충돌 및 정리 작업을 방지하려면 서버에서 TCP 버퍼 충돌 및 정리가 발생하는지 여부를 모니터링하고, 이 경우 TCP 버퍼를 튜닝합니다.
절차
nstat
유틸리티를 사용하여TcpExtTCPRcvCollapsed
및TcpExtRcvPruned
카운터를 쿼리합니다.# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 612859 0.0
잠시 기다렸다가
nstat
명령을 다시 실행합니다.# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 620358 0.0
카운터 값이 첫 번째 실행에 비해 증가한 경우 튜닝이 필요합니다.
-
애플리케이션에서
setsockopt(SO_RCVBUF)
호출을 사용하는 경우 해당 호출을 제거하는 것이 좋습니다. 이 호출을 사용하면 애플리케이션은 호출에 지정된 수신 버퍼 크기만 사용하고 소켓의 크기를 자동으로 조정하는 기능을 끕니다. -
애플리케이션에서
setsockopt(SO_RCVBUF)
호출을 사용하지 않는 경우 TCP 읽기 소켓 버퍼의 기본값 및 최대 값을 조정합니다.
-
애플리케이션에서
수신 백로그 큐 표시(
recv-Q
):# ss -nti State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.0.2.1:443 192.0.2.125:41574 :7,7 ... lastrcv:543 ... ESTAB 78 0 192.0.2.1:443 192.0.2.56:42612 :7,7 ... lastrcv:658 ... ESTAB 88 0 192.0.2.1:443 192.0.2.97:40313 :7,7 ... lastrcv:5764 ... ...
ss -nt
명령을 여러 번 실행하고 각 실행 사이의 대기 시간을 몇 초 동안 실행합니다.출력에
Recv-Q
열에서 높은 값의 경우만 나열되는 경우 애플리케이션은 두 개의 수신 작업 사이에 있었습니다. 그러나Recv-Q
의 값이 일정하게 유지되지만lastrcv
가 지속적으로 증가하거나Recv-Q
가 지속적으로 증가하는 경우 다음 문제 중 하나가 원인일 수 있습니다.- 애플리케이션은 소켓 버퍼를 충분히 자주 확인하지 않습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 애플리케이션 벤더에 문의하십시오.
애플리케이션에 CPU 시간이 충분하지 않습니다. 이 문제를 추가로 디버깅하려면 다음을 수행합니다.
애플리케이션이 실행하는 CPU 코어를 표시합니다.
# ps -eo pid,tid,psr,pcpu,stat,wchan:20,comm PID TID PSR %CPU STAT WCHAN COMMAND ... 44594 44594 5 0.0 Ss do_select httpd 44595 44595 3 0.0 S skb_wait_for_more_pa httpd 44596 44596 5 0.0 Sl pipe_read httpd 44597 44597 5 0.0 Sl pipe_read httpd 44602 44602 5 0.0 Sl pipe_read httpd ...
PSR
열에는 프로세스가 현재 할당된 CPU 코어가 표시됩니다.- 동일한 코어에서 실행 중인 다른 프로세스를 식별하고 다른 코어에 할당하는 것이 좋습니다.
추가 리소스