web-dev-qa-db-ja.com

カーネルソケット構造と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.hsock)からのものであることがわかりました。より正確には、それはフィールドから来ています:

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
18
Twister

sk_forward_allocは、ソケットの割り当てで現在使用可能な合計メモリである、前方に割り当てられたメモリです。

sk_wmem_queuedは、送信キューのキューに入れられたソケット送信バッファーによって使用され、まだ送信されていないか、まだ確認されていないメモリの量です。

TCPメモリ管理の詳細については、 TCP/IPアーキテクチャ、Linuxでの設計および実装)の第9章を参照してください。SameerSeth著、M。Ajaykumar Venkatesulu

7
aculich

Ssのmanページを参照してください。

<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)
1
wenjianhn

sk_wmem_queuedsk_wmem_allocについて、私は 同じ質問をした なので、ここに回答をコピーします。

Linuxネットワークスタックに貢献しているEric Dumazetにメールを送ったところ、その答えは次のとおりです。

sk_wmem_allocは、キューに入れられたskbのバイト数を追跡​​しますafterトランスポートスタック:qdiscレイヤーおよびNIC TXリングバッファー。

TCP書き込みキューにまだ1 MBのデータがある場合、まだ送信されていません(cwnd制限))、sk_wmem_queueは約1MBですが、sk_wmem_allocは約0になります

これら3つのタイプのキュー(ソケットバッファー、qdiscキュー、およびデバイスキュー)が何であるかを理解するための非常に優れたドキュメントは この記事(やや長い)記事 です。簡単に言うと、ソケットはパケットをqdiscキューに直接プッシュすることから始まり、qdiscキューはパケットをデバイスキューに転送します。 qdiscキューがいっぱいになると、ソケットは独自の書き込みキューでデータのバッファリングを開始します。

ネットワークスタックは、パケットを直接キューイング規則に配置するか、キューがいっぱいの場合は上位層(ソケットバッファーなど)にプッシュバックします。

つまり、基本的に:sk_wmem_queuesはソケットバッファー(sock.sk_write_queue)によって使用されるメモリであり、sk_wmem_allocはqdiscおよびデバイスキュー内のパケットによって使用されるメモリです。

0
little-dude