Linux 3.3 の cgroup 関連新機能 - TenForwardの日記 で少し紹介した Per-cgroup TCP buffer limits を軽いノリで試してみました.
(2012/04/12 追記) この機能,文字通り TCP の時のバッファサイズの制限を行うものですが,root cgroup (メモリコントローラの cgroup filesystem のルートディレクトリ) では制限は効きません.こんな機能使わない,という人がパフォーマンス劣化を起こさないための実装のようです.(2012/04/12 追記ここまで)
- グループを登録します.ここでは "test" というグループ.メモリコントローラ以下です.
# mkdir /sys/fs/cgroup/memory/test
# ls /sys/fs/cgroup/memory/test
cgroup.clone_children memory.memsw.limit_in_bytes
cgroup.event_control memory.memsw.max_usage_in_bytes
cgroup.procs memory.memsw.usage_in_bytes
memory.failcnt memory.move_charge_at_immigrate
memory.force_empty memory.oom_control
memory.kmem.tcp.failcnt memory.soft_limit_in_bytes
memory.kmem.tcp.limit_in_bytes memory.stat
memory.kmem.tcp.max_usage_in_bytes memory.swappiness
memory.kmem.tcp.usage_in_bytes memory.usage_in_bytes
memory.limit_in_bytes memory.use_hierarchy
memory.max_usage_in_bytes notify_on_release
memory.memsw.failcnt tasks - シェルを起動して,その pid を登録します.
# echo 2871 > /sys/fs/cgroup/memory/test/tasks
# cat /sys/fs/cgroup/memory/test/tasks
2871 - 適当な値を制限値として追加します.
# echo 100000 > /sys/fs/cgroup/memory/test/memory.kmem.tcp.limit_in_bytes
登録した値と違いますが,まあこれはなんとなく納得出来る値でしょう.(^^;)
# cat /sys/fs/cgroup/memory/test/memory.kmem.tcp.limit_in_bytes
102400 - iperf を実行します.実行している間,1 秒おきに memory.kmem.tcp.usage_in_bytes の値をウォッチしてみます.こんな適当な方法で.
$ while :; do cat /sys/fs/cgroup/memory/test/memory.kmem.tcp.usage_in_bytes ; sleep 1; done
なんか良く分からない値が表示されてますね.memory.kmem.tcp.max_usage_in_bytes を見てみると
0
0
0
159744
159744
159744
159744
159744
159744
159744
159744
159744
159744
0
0
^C$ cat /sys/fs/cgroup/memory/test/memory.kmem.tcp.max_usage_in_bytes
こちらはちゃんと制限値になってます.(^^;)
102400
もっと小さな値で試してみました.
- 登録
# mkdir /sys/fs/cgroup/memory/test
4096 が最小単位でしょうか? (ページ単位な気がします.4096 より大きく 8192 未満の数を指定すると 8192 になりました) :)
# cd /sys/fs/cgroup/memory/test
# echo 9520 > tasks
# echo 1024 > memory.kmem.tcp.limit_in_bytes
# cat memory.kmem.tcp.limit_in_bytes
4096 - 同様に実行して usage を観察.
$ while :; do cat /sys/fs/cgroup/memory/test/memory.kmem.tcp.usage_in_bytes ; sleep 1; done
こちらも最小消費単位? (^^;) max_usage を見てみると
0
0
131072
131072
131072
131072
131072
131072
131072
131072
131072
131072
0
^C# cat memory.kmem.tcp.max_usage_in_bytes
こちらは設定値となってます.usage で見るトコと max で見るトコが違う?
4096
なんか微妙な結果ですが,えー,理由は... わかりません.そのうち調べましょう.まあなんとなく分かる気がする数字なんですけどね.
(Linux 3.3 の新機能 Per-cgroup TCP buffer limits (2) - TenForwardの日記へ続く)