ablog

不器用で落着きのない技術者のメモ

カーネルパラメータ net.core.[rw]mem_{default,max} の意味を考えてみた

インストールの前提条件の作業を手動で行う方法 を見ると、カーネルパラメータ net.core.[rw]mem_{default,max} の推奨値が以下の通り記載されている。

カーネルパラメータ Byte 人に優しく
net.core.rmem_default 262144 256KB
net.core.rmem_max 4194304 4MB
net.core.wmem_default 262144 256KB
net.core.wmem_max 1048576 1MB

上記のカーネルパラメータがソケットを使用するアプリケーションにどのような影響を及ぼすか仮説を書いてみる。

仮説

  • net.core.[rw]mem_{default,max} は TCPUDP の送受信バッファのデフォルトサイズと最大サイズを決める。
  • net.ipv4.tcp_[rw]mem が設定されている場合、TCP の送受信バッファのデフォルトサイズと最大サイズはオーバーライドされる。
  • ソケットバッファを大きくした時のデメリットはメモリ使用量の増加と転送のリカバリが遅くなる点。
  • net.core.[rw]mem_default を変更するとデフォルトの送受信ソケットバッファサイズを使用するプロセスの送受信ソケットバッファサイズが変更されるので影響範囲に注意する必要がある。
  • net.core.rmem_default
    • 受信ソケットバッファのデフォルトサイズ。
    • アプリケーションが socket() を使用する際に SO_RCVBUF オプションによる受信ソケットバッファのサイズを変更しない場合、受信ソケットバッファのサイズは net.core.rmem_default になる。
    • この値を変更すると、SO_RCVBUF オプションで受信ソケットバッファのサイズを指定してない全てのアプリケーションの受信ソケットサイズが変更される。
  • net.core.rmem_max
    • 受信ソケットバッファの最大サイズ。
    • アプリケーションが socket() を使用する際に SO_RCVBUF オプションによる受信ソケットバッファのサイズを変更している場合、受信ソケットバッファのサイズは net.core.rmem_max より大きな値には設定できない。
  • net.core.wmem_default
    • 送信ソケットバッファのデフォルトサイズ。
    • アプリケーションが socket() を使用する際に SO_SNDBUF オプションによる送信ソケットバッファのサイズを変更しない場合、受信ソケットバッファのサイズは net.core.wmem_default になる。
    • この値を変更すると、SO_SNDBUF オプションで送信ソケットバッファのサイズを指定してない全てのアプリケーションの受信ソケットサイズが変更される。
  • net.core.wmem_max
    • 送信ソケットバッファの最大サイズ。
    • アプリケーションが socket() を使用する際に SO_SNDBUF オプションによる送信ソケットバッファのサイズを変更している場合、送信ソケットバッファのサイズは net.core.wmem_max より大きな値には設定できない。

検証したいこと

  • Oracle RAC で socket() を使用している各プロセスが SO_SNDBUF や SO_RCVBUF で送受信ソケットバッファのサイズを変更しているか否か strace などを使って確認する。
  • SO_SNDBUF や SO_RCVBUF で送受信ソケットバッファを変更しないプログラムを作成し、net.core.[rw]mem_default の値を変更して、getsockopt を使ってソケットバッファのサイズが変わることを確認する。
  • SO_SNDBUF や SO_RCVBUF で送受信ソケットバッファを変更するプログラムを作成し、ソケットバッファの値を net.core.[rw]mem_max より大きく設定できないことを確認する。

参考


追記(2011/06/14):

TCP/IP Illustrated Volume 2: The Implementation

TCP/IP Illustrated Volume 2: The Implementation

Section 16.7
P.493

After all the data has been passed to the protocol,the socket buffer is unlocked, any remaining mbufs are discarded, and sosend returns.

この本ちゃんと読んだらわかりそうだけど、なかなか歯ごたえありそうw