sock
で定義されている構造にはsock.h
非常によく似ている2つの属性があります。
sk_wmem_alloc
、「コミットされた転送キューバイト」として定義されていますsk_wmem_queued
、「持続キューサイズ」として定義
私にとって、これはsk_wmem_alloc
現在転送キューに割り当てられているメモリ量です。しかし、何ですかsk_wmem_queued
?
引用する
- ~によるとこのStackOverflowの答え:
wmem_queued: 転送キューで待機中で、まだ転送または承認されていないソケット転送バッファが使用するメモリ量。
- その
ss
人も正義を下しましたが、私にはあまり理解できませんでした。 (IP層がこれとどのように関連しているのか理解できません。)wmem_allocation:パケット転送に使用されるメモリ(レイヤ3に転送) wmem_queued:パケット転送用に割り当てられたメモリ(まだレイヤ3に転送されていません)
- もう誰かがいます。LKMLでも同様の質問が出ました。しかし、答えはありません。
- マニュアル
sock_diag(7)
ページには、次の属性の独自の定義もあります。SK_MEMINFO_WMEM_ALLOC:送信キュー内のデータ量。 SK_MEMINFO_WMEM_QUEUED:TCPで待機しているがまだ送信されていないデータ量。
これらの定義はすべて異なり、変形がどのように_alloc
異なるかを明確に説明する定義はありません。_queued
ベストアンサー1
Linuxネットワーキングスタックの寄稿者であるEric Dumazetに電子メールを送信しましたが、答えは次のとおりです。
sk_wmem_alloc
skb がキューに入れたバイト数を追跡します。後ろにトランスポートスタック:qdisc層とNIC TXリングバッファ。まだ送信されていないTCP書き込みキューに1MBのデータがある場合(cwnd制限)、
sk_wmem_queue
これは約1MBですが、sk_wmem_alloc
約0です。
これら3つのタイプのキュー(ソケットバッファ、qdiscキュー、デバイスキュー)を理解するのに非常に良いドキュメントは次のとおりです。この記事(かなり長いです)。つまり、ソケットは最初にパケットをqdiscキューに直接プッシュし、次にデバイスキューに転送します。 qdisc キューがいっぱいになると、ソケットは自己書き込みキューでデータのバッファリングを開始します。
ネットワークスタックは、パケットをキューイングルールに直接配置するか、キューがいっぱいになった場合にパケットを上位層(たとえばソケットバッファ)に戻します。
したがって、デフォルトではソケットバッファ()で使用されるメモリですが、sk_wmem_queues
qdiscおよびデバイスキューのパケットで使用されるメモリです。sock.sk_write_queue
sk_wmem_alloc