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
제 질문은: 메모리 부분이 무엇을 의미하나요? 도구의 소스 코드를 보면 데이터가 커널 구조( sock
in 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_alloc
skb가 대기열에 넣은 바이트 수를 추적합니다.뒤쪽에전송 스택: qdisc 계층 및 NIC TX 링 버퍼.아직 전송되지 않은 TCP 쓰기 큐에 1MB의 데이터가 있는 경우(cwnd 제한)
sk_wmem_queue
이는 약 1MB이지만sk_wmem_alloc
약 0입니다.
이 세 가지 유형의 큐(소켓 버퍼, qdisc 큐, 장치 큐)를 이해하는 데 아주 좋은 문서는 다음과 같습니다.이 글(꽤 깁니다). 즉, 소켓은 먼저 패킷을 qdisc 대기열에 직접 푸시한 다음 장치 대기열로 전달합니다. qdisc 대기열이 가득 차면 소켓은 자체 쓰기 대기열에서 데이터 버퍼링을 시작합니다.
네트워크 스택은 패킷을 큐잉 규칙에 직접 배치하거나 큐가 가득 찬 경우 패킷을 상위 계층(예: 소켓 버퍼)으로 다시 푸시합니다.
따라서 기본적으로는 소켓 버퍼( )에서 사용하는 메모리이지만 sk_wmem_queues
qdisc 및 장치 대기열의 패킷에서 사용하는 메모리입니다.sock.sk_write_queue
sk_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)