Block I/O Tuning
可选的blkiotune元素通过设置参数,调控本虚机的Blkio cgroup参数设置,通过此设置可管控块io的读写速率。如果省略此项,则默认为操作系统提供的默认值。从libvirt0.8.8版本开始支持。
使用举例:
<domain>
...
<blkiotune>
<weight>800</weight>
<device>
<path>/dev/sda</path>
<weight>1000</weight>
</device>
<device>
<path>/dev/sdb</path>
<weight>500</weight>
<read_bytes_sec>10000</read_bytes_sec>
<write_bytes_sec>10000</write_bytes_sec>
<read_iops_sec>20000</read_iops_sec>
<write_iops_sec>20000</write_iops_sec>
</device>
</blkiotune>
...
</domain>
各元素详解:
1.weight
可选weight元素是虚机的总体IO调度权重。该值应在[100-1000]范围内。在内核2.6.39之后,该值可能在[10-1000]范围内。
IO调度权重:通过设置资源组IO的权重比例实现IO限制,该策略基于CFQ调度算法(Linux内核磁盘IO调度算法)通过分配其IO处理的时间片来实现,因此需要确认磁盘对应的调度算法为CFQ(Linux默认值)。——此种说法是对于老内核的单队列调度而言,目前ctyun2112使用的都是多队列调度。
查看ctyun2112,io调度算法为:
# cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none
对于ctyun2112的内核版本,必须将host上的对应磁盘调度算法改为bfq,weight设置才生效。vm中的io调度算法可以随便设置对此无影响。
weight值的设置是设置的cgroup blkio子系统的blkio.bfq.weight接口,接口默认值为100。该接口只对cgroup控制下的各个进程起作用,如两个虚机,一个设置为200,一个设置为800,则设为800的虚机io调度时间是另一个虚机的4倍,io速率也就是另一个虚机的4倍;blkio.bfq.weight接口的设置对host上的进程不起作用,如若虚机设置为200,和host上的进程进行io争用,此时设置不生效,仍然是公平分配io时间。
2.device
可以具有多个device元素,这些device元素进一步调整每个块设备的weight。需要注意,多个虚机可以共享同一块主机块设备,如果它们由同一主机文件系统中的文件支持,这就是为什么此调优参数位于全局域级别,而不是与每个虚机磁盘设备关联(与可应用于单个<disk>的<iotune>元素相比)。
每个device元素都有两个必需的子元素:
path:描述设备的绝对路径
weight:给出设备的相对weight
Since 0.9.8 Additionally, 可使用以下可选子元素:
read_bytes_sec:读取吞吐量限制(以字节/秒为单位)。Since 1.2.2。此参数会写入到Cgroup blkio的blkio.throttle.read_bps_device参数中。
write_bytes_sec:写入吞吐量限制(以字节/秒为单位)。Since 1.2.2。此参数会写入到Cgroup blkio的blkio.throttle.write_bps_device参数中。
read_iops_sec:读iops限制。Since 1.2.2。此参数会写入到Cgroup blkio的blkio.throttle.read_iops_device参数中。
write_iops_sec:写iops限制。Since 1.2.2。此参数会写入到Cgroup blkio的blkio.throttle.write_iops_device参数中。
此外,可以使用以下可选子元素:
read_bytes_sec
读吞吐量限制,以每秒字节为单位从libvirt 1.2.2开始支持
write_bytes_sec
写吞吐量限制,以每秒字节数为单位从libvirt 1.2.2开始支持
read_iops_sec
每秒读I / O操作限制。从libvirt 1.2.2开始支持
write_iops_sec
每秒写I / O操作限制。从libvirt 1.2.2开始支持