Red Hat Training

A Red Hat training course is available for RHEL 8

34.7. 애플리케이션 읽기 소켓 버퍼 병목 현상 식별

TCP 애플리케이션에서 읽기 소켓 버퍼를 자주 지우지 않으면 성능이 저하될 수 있으며 패킷이 손실될 수 있습니다. Red Hat Enterprise Linux는 이러한 문제를 식별할 수 있는 다양한 유틸리티를 제공합니다.

34.7.1. 수신 버퍼 충돌 및 정리 확인

수신 대기열의 데이터가 수신 버퍼 크기를 초과하면 TCP 스택은 소켓 버퍼에서 불필요한 메타데이터를 제거하여 일부 공간을 확보하려고 합니다. 이 단계를 collapsing이라고 합니다.

충돌 시 추가 트래픽을 위한 충분한 공간을 확보하지 못하는 경우 커널은 도달되는 새 데이터를 정리합니다. 즉, 커널은 메모리에서 데이터를 제거하고 패킷이 손실됩니다.

충돌 및 정리 작업을 방지하려면 서버에서 TCP 버퍼 충돌 및 정리가 발생하는지 여부를 모니터링하고, 이 경우 TCP 버퍼를 튜닝합니다.

절차

  1. nstat 유틸리티를 사용하여 TcpExtTCPRcvCollapsedTcpExtRcvPruned 카운터를 쿼리합니다.

    # nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned
    #kernel
    TcpExtRcvPruned            0         0.0
    TcpExtTCPRcvCollapsed      612859    0.0
  2. 잠시 기다렸다가 nstat 명령을 다시 실행합니다.

    # nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned
    #kernel
    TcpExtRcvPruned            0         0.0
    TcpExtTCPRcvCollapsed      620358    0.0
  3. 카운터 값이 첫 번째 실행에 비해 증가한 경우 튜닝이 필요합니다.

    • 애플리케이션에서 setsockopt(SO_RCVBUF) 호출을 사용하는 경우 해당 호출을 제거하는 것이 좋습니다. 이 호출을 사용하면 애플리케이션은 호출에 지정된 수신 버퍼 크기만 사용하고 소켓의 크기를 자동으로 조정하는 기능을 끕니다.
    • 애플리케이션에서 setsockopt(SO_RCVBUF) 호출을 사용하지 않는 경우 TCP 읽기 소켓 버퍼의 기본값 및 최대 값을 조정합니다.
  4. 수신 백로그 큐 표시(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 ...
    ...
  5. ss -nt 명령을 여러 번 실행하고 각 실행 사이의 대기 시간을 몇 초 동안 실행합니다.

    출력에 Recv-Q 열에서 높은 값의 경우만 나열되는 경우 애플리케이션은 두 개의 수신 작업 사이에 있었습니다. 그러나 Recv-Q 의 값이 일정하게 유지되지만 lastrcv 가 지속적으로 증가하거나 Recv-Q 가 지속적으로 증가하는 경우 다음 문제 중 하나가 원인일 수 있습니다.

    • 애플리케이션은 소켓 버퍼를 충분히 자주 확인하지 않습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 애플리케이션 벤더에 문의하십시오.
    • 애플리케이션에 CPU 시간이 충분하지 않습니다. 이 문제를 추가로 디버깅하려면 다음을 수행합니다.

      1. 애플리케이션이 실행하는 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 코어가 표시됩니다.

      2. 동일한 코어에서 실행 중인 다른 프로세스를 식별하고 다른 코어에 할당하는 것이 좋습니다.