読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

Linux 3.3 の新機能 Per-cgroup TCP buffer limits

Linux 3.3 の cgroup 関連新機能 - TenForwardの日記 で少し紹介した Per-cgroup TCP buffer limits を軽いノリで試してみました.

(2012/04/12 追記) この機能,文字通り TCP の時のバッファサイズの制限を行うものですが,root cgroup (メモリコントローラの cgroup filesystem のルートディレクトリ) では制限は効きません.こんな機能使わない,という人がパフォーマンス劣化を起こさないための実装のようです.(2012/04/12 追記ここまで)

  1. グループを登録します.ここでは "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
  2. シェルを起動して,その pid を登録します.
    # echo 2871 > /sys/fs/cgroup/memory/test/tasks
    # cat /sys/fs/cgroup/memory/test/tasks
    2871
  3. 適当な値を制限値として追加します.
    # 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
    登録した値と違いますが,まあこれはなんとなく納得出来る値でしょう.(^^;)
  4. 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
    0
    0
    0
    159744
    159744
    159744
    159744
    159744
    159744
    159744
    159744
    159744
    159744
    0
    0
    ^C
    なんか良く分からない値が表示されてますね.memory.kmem.tcp.max_usage_in_bytes を見てみると
    $ cat /sys/fs/cgroup/memory/test/memory.kmem.tcp.max_usage_in_bytes
    102400
    こちらはちゃんと制限値になってます.(^^;)

もっと小さな値で試してみました.

  1. 登録
    # mkdir /sys/fs/cgroup/memory/test
    # 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
    4096 が最小単位でしょうか? (ページ単位な気がします.4096 より大きく 8192 未満の数を指定すると 8192 になりました) :)
  2. 同様に実行して usage を観察.
    $ while :; do cat /sys/fs/cgroup/memory/test/memory.kmem.tcp.usage_in_bytes ; sleep 1; done
    0
    0
    131072
    131072
    131072
    131072
    131072
    131072
    131072
    131072
    131072
    131072
    0
    ^C
    こちらも最小消費単位? (^^;) max_usage を見てみると
    # cat memory.kmem.tcp.max_usage_in_bytes
    4096
    こちらは設定値となってます.usage で見るトコと max で見るトコが違う?

なんか微妙な結果ですが,えー,理由は... わかりません.そのうち調べましょう.まあなんとなく分かる気がする数字なんですけどね.

(Linux 3.3 の新機能 Per-cgroup TCP buffer limits (2) - TenForwardの日記へ続く)