TenForward

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

Linux 3.2 の CFS bandwidth control (2)

Linux 3.2 の CFS bandwidth control (1) - TenForwardの日記 の続編.簡単に動きを見てみました.

シェルを二つ起動して,こんなスクリプトを実行してみました.

# while :; do true ; done

結果は top コマンドで観測.まあ,これでは厳密にちゃんと動いているのかは分からないですが,とりあえず簡単な目安には...

# top -p 3146,3148
  1. cgroupfs にグループを作成します.
    # cd /sys/fs/cgroup/cpu
    # mkdir test1 test2
  2. シェルを 2 つ起動し,それぞれの pid をグループに登録.
    # echo 3168 > /sys/fs/cgroup/cpu/test1/tasks
    # echo 3146 > /sys/fs/cgroup/cpu/test2/tasks
  3. 一応,cpu.cfs_period_us の値を確認.この時間内で最大どれだけ時間を使えるか? を設定します.デフォルトは 100ms になってます.とりあえずこのまま.
    # cat cpu.cfs_period_us
    100000
  4. 両方のグループに 5ms を登録してみます.
    # echo 5000 > /sys/fs/cgroup/cpu/test1/cpu.cfs_quota_us
    # echo 5000 > /sys/fs/cgroup/cpu/test2/cpu.cfs_quota_us
    • 結果はこんな感じです.5% ずつ消費してます.
        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
      3146 karma 20 0 19104 2204 1540 R 5 0.0 0:42.52 bash
      3168 karma 20 0 19104 2208 1540 R 5 0.0 0:42.50 bash
  5. 片方を 10ms にしてみます.
    # echo 10000 > /sys/fs/cgroup/cpu/test2/cpu.cfs_quota_us
    • 片方が 10% になります.
        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
      3146 karma 20 0 19104 2204 1540 R 10 0.0 2:13.11 bash
      3168 karma 20 0 19104 2208 1540 R 5 0.0 2:04.39 bash
  6. もう片方も 10ms に.
    # echo 10000 > test1/cpu.cfs_quota_us
    • 両方とも 10% に.
        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
      3146 karma 20 0 19104 2204 1540 R 10 0.0 2:23.03 bash
      3168 karma 20 0 19104 2208 1540 R 10 0.0 2:12.26 bash
  7. 片方を 50ms に.
    # echo 50000 > test1/cpu.cfs_quota_us
    • 片方が 50% に.
        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
      3168 karma 20 0 19104 2208 1540 R 50 0.0 2:30.88 bash
      3146 karma 20 0 19104 2204 1540 R 10 0.0 2:29.01 bash

統計情報は cpu.stat ファイルで見ることが可能です.

# cat /sys/fs/cgroup/cpu/test1/cpu.stat 
nr_periods 42283
nr_throttled 32321
throttled_time 1723251367447