Linux

核心套接字結構和 TCP_DIAG

  • November 12, 2019

我正在開發一個連接到實時數據伺服器(使用 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

sk_forward_alloc是前向分配的記憶體,它是套接字配額中目前可用的總記憶體。

sk_wmem_queued是在傳輸隊列中排隊的套接字發送緩衝區使用的記憶體量,並且尚未發送出去或尚未確認。

您可以在 Sameer Seth、M. Ajaykumar Venkatesulu 撰寫的 TCP/IP 架構、Linux 中的設計和實現的第 9 章中了解有關 TCP 記憶體管理的更多資訊

請參閱 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)

引用自:https://unix.stackexchange.com/questions/33855