めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

cgroupsによるIO帯域の制限

Kernel 2.6.37で導入された表題の機能が、RHEL6.1にバックポートされています。非常に分かりやすい機能ですので、実験結果を書き残しておきます。(RHEL6.0には入っていませんのでご注意を。)

パラメータの説明

・blkio.throttle.read_bps_device
・blkio.throttle.write_bps_device

特定のデバイスに対するアクセス速度の上限をByte/Sec単位で指定。0を指定すると制限を解除。
指定方法は"Major:Minor 設定値"(例"8:0 1048576")

・blkio.throttle.read_iops_device
・blkio.throttle.write_iops_device

特定のデバイスに対するアクセス速度の上限をIO/Sec単位で指定。0を指定すると制限を解除。
指定方法は"Major:Minor 設定値"(例"8:0 2048")

Minor番号の指定がありますが、実際にはディスクパーティション単位での指定はできない場合があるようです。パーティション/dev/sda1, /dev/sda2・・などを使用している場合は、/dev/sdaに対して指定してください。

事前準備

cgconfigサービスが起動していない場合は、起動しておきます。

# chkconfig cgconfig on
# service cgconfig start

実験例

/tmpに対応するブロックデバイスを確認します。下記の例では、メジャー番号252の/dev/vdaと分かります。

# ls -l $(df /tmp | tail -1 | cut -d " " -f 1)
brw-rw----. 1 root disk 252, 3  7月 20 19:43 2011 /dev/vda3

書き込みの上限を1MB/Secに指定した場合と指定を解除した場合の比較。ぴったり、1.0MB/sに制限されていることが分かります。

# echo "252:0 1048576" > /cgroup/blkio/blkio.throttle.write_bps_device 
# dd if=/dev/zero of=/tmp/tmp0 bs=4K count=1024 oflag=direct
1024+0 records in
1024+0 records out
4194304 bytes (4.2 MB) copied, 4.05497 s, 1.0 MB/s

# echo "252:0 0" > /cgroup/blkio/blkio.throttle.write_bps_device 
# dd if=/dev/zero of=/tmp/tmp1 bs=4K count=1024 oflag=direct
1024+0 records in
1024+0 records out
4194304 bytes (4.2 MB) copied, 0.369282 s, 11.4 MB/s

# rm -f /tmp/tmp0 /tmp/tmp1

書き込みの上限を100IOPSに指定した場合の結果。ブロックサイズに関係なく、1000回のIOにぴったり10秒かかっています。

# echo "252:0 100" > /cgroup/blkio/blkio.throttle.write_iops_device 
# time dd if=/dev/zero of=/tmp/tmp0 bs=4K count=1000 oflag=direct
1000+0 records in
1000+0 records out
4096000 bytes (4.1 MB) copied, 10.1122 s, 405 kB/s

real		0m10.114s
user		0m0.001s
sys		0m0.072s

# time dd if=/dev/zero of=/tmp/tmp1 bs=1K count=1000 oflag=direct
1000+0 records in
1000+0 records out
1024000 bytes (1.0 MB) copied, 10.1045 s, 101 kB/s

real		0m10.107s
user		0m0.001s
sys		0m0.061s

# echo "252:0 0" > /cgroup/blkio/blkio.throttle.write_iops_device
# rm -f /tmp/tmp0 /tmp/tmp1

KVM環境では、ホストLinux上で仮想マシン(qemu-kvmプロセス)ごとの設定ができますので、仮想マシン間でのIO帯域の振り分けが可能になります。

KVM仮想マシンのIO帯域を制限してみる

libvirtで管理している環境では、ホストLinux上で下記のファイルに値を出力することで、仮想マシンごとに設定ができます。

/cgroup/blkio/libvirt/qemu//blkio.throttle.*

2個の仮想マシンに対して、50Mbpsと10Mbpsの設定を行います。

# echo "8:0 50000000" > /cgroup/blkio/libvirt/qemu/RHEL61vm00/blkio.throttle.write_bps_device 
# echo "8:0 10000000" > /cgroup/blkio/libvirt/qemu/RHEL60vm00/blkio.throttle.write_bps_device 

それぞれの仮想マシン上で、IO連続出力を行いながら、ホストLinuxのvirt-topでIO状況を確認します。

# virt-top -3 -d 1

想定どおりの結果ですね。