Linux
核心套接字結構和 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
我的問題是:記憶體部分是什麼意思?查看該工具的原始碼,我發現數據來自核心結構(
sock
insock.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)