簡単なメモ
net.core.(r|w)mem_max
setsockopt(2) の SO_RCVBUF, SO_SNDBUF で指定できる値の最大値。
SO_RCVBUF, SO_SNDBUF はそれぞれソケットの受信・送信バッファのサイズ。
rmem_max は初期 window サイズの上限値にもなる。
net.ipv4.tcp_mem
システム全体で TCP が消費できるメモリの最大値。単位はページ。
左から順に min/pressure/max.
# CentOS 7.0.1406 での例
# この場合は 135MB, 181MB, 271MB になる
$ cat /proc/sys/net/ipv4/tcp_mem
33972 45296 67944
デフォルト値は起動時の空きメモリをベースに計算される。
min は使えることが保証される値。
TCP 全体の消費量が pressure を超えるとメモリ消費が抑制されはじめる。
具体的には windows サイズを大きくすることをやめたり送信バッファの拡張を控えて最小限のメモリ確保で動作するようになる。
このモードになった回数は /proc/net/netstat の TCPMemoryPressures で確認できる。
これは min を下回るまで続く。(下回ると解除される)
max を超えることは無く、仮に超えるようなメモリ確保が走ると失敗する。
net.ipv4.tcp_(r|w)mem
ソケット1つ1つが使うバッファのサイズ。
左から順に min, deault, max.
$ cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
ソケットが作られると送受信バッファはデフォルトが割り当てられ、必要に応じて最大値まで大きくなる。
メモリに余裕があるならば最大値の設定を変えることで性能を向上させられる。
ただしこれはソケットごとの設定のため、ソケット数の最大値や運用状況に応じて計算する必要がある。