커널 소켓 구조 및 TCP_DIAG

커널 소켓 구조 및 TCP_DIAG

TCP를 사용하여 라이브 데이터 서버에 연결하는 소프트웨어를 개발 중이지만 일부 연결이 끊어졌습니다. 내 생각엔 클라이언트가 서버에서 데이터를 충분히 빠르게 읽지 못하는 것 같습니다. 따라서 TCP 소켓을 모니터링하고 싶습니다. 이를 위해 "ss" 도구를 찾았습니다.

이 도구를 사용하면 각 소켓의 상태를 볼 수 있습니다. 다음은 명령 출력의 샘플 라인입니다.ss -inm 'src *:50000'

ESTAB      0      0             184.7.60.2:50000       184.92.35.104:1105
  mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40

제 질문은: 메모리 부분이 무엇을 의미하나요? 도구의 소스 코드를 보면 데이터가 커널 구조( sockin sock.h)에서 나오는 것을 알 수 있습니다. 보다 정확하게는 다음 영역에서 비롯됩니다.

r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;

그게 무슨 뜻인지 아는 사람 있나요? 내 추측은 다음과 같습니다

  • rmem_alloc: 인바운드 버퍼의 크기
  • wmem_alloc: 아웃바운드 버퍼의 크기
  • sk_forward_alloc: ???
  • sk->sk_wmem_queued: ???

내 버퍼 크기는 다음과 같습니다.

net.ipv4.tcp_rmem = 4096        87380   174760
net.ipv4.tcp_wmem = 4096        16384   131072
net.ipv4.tcp_mem = 786432       1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071

답변1

sk_forward_alloc현재 소켓 할당량에서 사용할 수 있는 총 메모리인 앞으로 할당된 메모리입니다.

sk_wmem_queued전송 큐에 대기 중이고 아직 전송되거나 승인되지 않은 소켓 전송 버퍼에서 사용하는 메모리의 양입니다.

9장에서 TCP 메모리 관리에 대해 자세히 알아볼 수 있습니다.Linux에서의 TCP/IP 아키텍처, 설계 및 구현 작성자: Sameer Seth, M. Ajaykumar Venkatesulu

답변2

나와 나 sk_wmem_queued에 대해sk_wmem_alloc같은 질문을 하더군요따라서 여기에 답변을 복사하겠습니다.

Linux 네트워킹 스택의 기고자인 Eric Dumazet에게 이메일을 보냈는데, 답변은 다음과 같습니다.

sk_wmem_allocskb가 대기열에 넣은 바이트 수를 추적합니다.뒤쪽에전송 스택: qdisc 계층 및 NIC TX 링 버퍼.

아직 전송되지 않은 TCP 쓰기 큐에 1MB의 데이터가 있는 경우(cwnd 제한) sk_wmem_queue이는 약 1MB이지만 sk_wmem_alloc약 0입니다.

이 세 가지 유형의 큐(소켓 버퍼, qdisc 큐, 장치 큐)를 이해하는 데 아주 좋은 문서는 다음과 같습니다.이 글(꽤 깁니다). 즉, 소켓은 먼저 패킷을 qdisc 대기열에 직접 푸시한 다음 장치 대기열로 전달합니다. qdisc 대기열이 가득 차면 소켓은 자체 쓰기 대기열에서 데이터 버퍼링을 시작합니다.

네트워크 스택은 패킷을 큐잉 규칙에 직접 배치하거나 큐가 가득 찬 경우 패킷을 상위 계층(예: 소켓 버퍼)으로 다시 푸시합니다.

따라서 기본적으로는 소켓 버퍼( )에서 사용하는 메모리이지만 sk_wmem_queuesqdisc 및 장치 대기열의 패킷에서 사용하는 메모리입니다.sock.sk_write_queuesk_wmem_alloc

답변3

ss에 대한 매뉴얼 페이지를 참조하십시오.

<fwd_alloc>
   The  memory allocated by the socket as cache, but not used for receiving/sending packet yet. If need memory to send/receive packet, the memory in this cache will be used before allocate additional memory.

<wmem_queued>
   The memory allocated for sending packet (which has not been sent to layer 3)

관련 정보