引用する

引用する

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_allocskb がキューに入れたバイト数を追跡​​します。後ろにトランスポートスタック:qdisc層とNIC TXリングバッファ。

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

これら3つのタイプのキュー(ソケットバッファ、qdiscキュー、デバイスキュー)を理解するのに非常に良いドキュメントは次のとおりです。この記事(かなり長いです)。つまり、ソケットは最初にパケットをqdiscキューに直接プッシュし、次にデバイスキューに転送します。 qdisc キューがいっぱいになると、ソケットは自己書き込みキューでデータのバッファリングを開始します。

ネットワークスタックは、パケットをキューイングルールに直接配置するか、キューがいっぱいになった場合にパケットを上位層(たとえばソケットバッファ)に戻します。

したがって、デフォルトではソケットバッファ()で使用されるメモリですが、sk_wmem_queuesqdiscおよびデバイスキューのパケットで使用されるメモリです。sock.sk_write_queuesk_wmem_alloc

おすすめ記事