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/
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
想定どおりの結果ですね。