Cgroup blkio简介和测试(使用fio测试)
Cgroup blkio简介和测试(使用fio测试)
因需要对docker镜像内的进程对磁盘读写的速度进行限制,研究了下Cgroup blkio,并使用fio对其iops/bps限速进行测试。
Cgroup blkio简介
Linux Cgroup(Control Groups)是Linux内核提供的用于限制、记录、隔离进程组可以使用的资源(cpu、memory、IO等)的一种机制。
在/boot下面的对应config文件里查看Cgroup内核选项:
CONFIG_BLK_CGROUP=y
CONFIG_BLK_DEV_THROTTLING=y
blkio子系统
Cgroup里每个子系统(SubSystem)对应一种资源,Cgroup blkio子系统用于限制块设备I/O速率。
挂载Cgroup root目录以及blkio子系统如下所示:
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
在对应的子系统目录下通过mkdir创建资源组,rmdir可将对应资源组删除。通过将进程pid加入到资源组目录下的tasks文件的方式把某个进程加入到对应资源组。如下所示:
mkdir /sys/fs/cgroup/blkio/test
echo 9527 > /sys/fs/cgroup/blkio/test/tasks
blkio资源限制策略
blkio支持两种IO资源限制策略:IO调度权重和iops/bps限制
- IO调度权重
通过设置资源组IO的权重比例实现IO限制,该策略基于CFQ调度算法(Linux内核磁盘IO电梯算法)通过分配其IO处理的时间片来实现,因此需要确认磁盘对应的电梯算法为CFQ(Linux默认值)。
单个资源组权重取值范围100-1000。设置方法如下:
echo 500 > blkio.weight
echo "8:0 500" > blkio.weight_device
其中8:0为磁盘设备号(major:minor)。具体设备的weight_device权重的优先级高于weight默认权重。
IO调度权重使用CFQ调度算法,显得比较公平,其保障资源组最低的IO比例(对应iops有最低保证)。在设备空闲的时候,还能超限使用。因此不适用于需要严格限制资源组IO资源上限的场景。
- iops和bps限制
支持设置资源组读和写的iops、bps上限。这样在该资源组内的进程读写IO的iops和bps不会超出设置值。设置方法如下:
echo "8:0 102400" > blkio.throttle.read_bps_device
echo "8:0 10" > blkio.throttle.read_iops_device
echo "8:0 204800" > blkio.throttle.write_bps_device
echo "8:0 20" > blkio.throttle.write_iops_device
其中读bps限定在100KB,读iops限定在10。可以只设置读或者写的iops,或者bps,也可以都设置。
相比IO调度权重,iops和bps限制更加直接和量化,更适合用于限制docker容器磁盘IO上限。
使用fio测试blkio
当前3.3版本的fio支持配置cgroup进行测试,但只支持配置cgroup的weight值。
为了测试blkio iops/bps限制,在该版本fio基础上,添加了支持配置iops/bps的代码。可从github上直接下载编译修改后的fio。
blkio iops/bps功能测试
使用fio启动两个进程分属两个Cgroup进行blkio功能测试,fio配置文件如下:
[root@A03-R14-I156-1 jimbo]# cat test.fio
[global]
bs=4K
ioengine=libaio
iodepth=32
direct=1
rw=randrw
rwmixread=50
time_based
runtime=60
cgroup_nodelete=0
[test1]
filename=/export/kubelet/pods/802b34b1-eac7-11e7-bc92-246e9665d1b0/volumes/kubernetes.io~lvm/export/fio/test1.img
size=512M
cgroup_read_iops=8:16 100
cgroup_write_iops=8:16 100
cgroup_read_bps=8:16 1024000
cgroup_write_bps=8:16 1024000
cgroup=test1
[test2]
filename=/export/kubelet/pods/802b34b1-eac7-11e7-bc92-246e9665d1b0/volumes/kubernetes.io~lvm/export/fio/test2.img
size=512M
cgroup_read_iops=8:16 1000
cgroup_write_iops=8:16 1000
cgroup_read_bps=8:16 102400
cgroup_write_bps=8:16 102400
cgroup=test2
其中Cgroup设备号需要设置为物理磁盘(如sdb)或者lvm卷(如dm-5)的设备号,设置为磁盘分区(如sdb1)设备号或者loop设备号时是无效的。
对于docker镜像使用lvm磁盘时,测试结果显示设置设备号为lvm盘和物理磁盘的限速效果是一样的。
如果将bs设置过大,会导致buffered read/write时大量的IO在缓存命中,并没有实际提交给磁盘,此时fio的统计的iops/bps是不准的。
所以本次测试设置bs=4K,尽量避免缓存命中的情况发生。
启动fio测试:
[root@A03-R14-I156-1 jimbo]# ./fio ./test.fio
可直接查看fio输出读写IOPS和BW统计,需要注意有些场景(如buffered write)fio的输出并不准确,还需要结合iostat等磁盘统计工具进一步确认磁盘iops/bps的真实情况。
fio的输出如下:
test1: (groupid=0, jobs=1): err= 0: pid=619842: Fri Dec 29 16:28:41 2017
read: IOPS=98, BW=392KiB/s (402kB/s)(23.0MiB/60109msec)
...
write: IOPS=99, BW=396KiB/s (406kB/s)(23.3MiB/60109msec)
...
test2: (groupid=0, jobs=1): err= 0: pid=619843: Fri Dec 29 16:28:41 2017
read: IOPS=23, BW=94.7KiB/s (96.0kB/s)(5768KiB/60917msec)
...
write: IOPS=25, BW=100KiB/s (103kB/s)(6100KiB/60917msec)
...
可以看到test1被IOPS限制在了100,test2被bps限制在了100KiB/s。
使用该方法测试了randread、randwrite、randrw结果如下:
- DIO read、DIO write、buffered read都被成功限制住了iops/bps;
- buffered write却并没有被限制住;
Buffered write没有被限制住,是因为本次测试基于CentOS 7.2内核版本号为3.10.0,该版本内核blkio有如下描述:
Currently only sync IO queues are support. All the buffered writes are still system wide and not per group. Hence we will not see service differentiation between buffered writes between groups.
从YY哥分析的Buffer IO的throttle问题可以看到buffered写IO在内核异步线程提交时无法获取到用户进程信息,因此blkio无法支持buffered write的统计。该问题在4.2版本的Cgroup V2上得到了解决,该版本Cgroup相比V1做了很大改进并支持了writeback。详情可参看博客Cgroup V2 and writeback support。
blkio压力测试
通过如下脚本测试在同一个资源组上启动N个fio进程进行blkio压力测试:
#!/bin/bash
for ((N=0; N<100; N++))
do
./fio -filename=/export/kubelet/pods/802b34b1-eac7-11e7-bc92-246e9665d1b0/volumes/kubernetes.io~lvm/export/fio/test$N.img -size=256M -rw=randrw -ioengine=libaio -iodepth=32 -bs=4K -direct=1 -rwmixread=50 -time_based -runtime=60 -cgroup_nodelete=0 -cgroup=test -cgroup_read_iops="8:16 10000" -cgroup_write_iops="8:16 10000" -cgroup_read_bps="8:16 10240000" -cgroup_write_bps="8:16 10240000" -name=test$N -output=./output$N &
done
sleep 60
测试结果显示,N=100个进程测试时,所有IO总和都被限定在了test资源组设置的iops和bps下。
修改上述脚本中-cgroup=test
为-cgroup=test$N
,即可进行在N个资源组上启动N个fio进程进行blkio压力测试。
测试结果显示,当IO超出物理磁盘的能力时,每个资源组上的进程都无法达到iops和bps的限制,基本上比较平均的占用磁盘带宽。
Cgroup blkio简介和测试(使用fio测试)的更多相关文章
- 硬盘测试工具fio用法总结
一 fio介绍 linux下的一种常用的磁盘测试工具,支持裸盘和文件形式进行测试 二 硬盘测试常用名词 延迟:io的发起到返回写入成功的时间成为延迟,fio中延迟分为lat,slat,clat ...
- 云计算&存储测试:FIO工具入门与实战
一.关于FIO 1.1 简介 FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘的IO性能,也可测试cpu,nic的IO性能.它可以支持13种不同的I/O引擎,包括:sync,mmap, lib ...
- linux使用FIO测试磁盘的iops 【转载】
linux使用FIO测试磁盘的iops 2013-09-23 10:59:21 分类: LINUX FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括 ...
- IdentityServer4 中文文档 -6- (简介)示例服务器和测试
IdentityServer4 中文文档 -6- (简介)示例服务器和测试 原文:http://docs.identityserver.io/en/release/intro/test.html 目 ...
- 使用FIO测试磁盘iops
我们如何衡量一个存储的性能呢?IOPS(Input/Output OperationsPer Second),即每秒进行读写(I/O)操作的次数是国际上通用的存储性能衡量标准,IOPS越高意味着在同一 ...
- fio 测试磁盘
root@rook-test:/# ceph osd status+----+-----------------------------+-------+-------+--------+------ ...
- [记录]FIO测试磁盘iops性能
FIO测试磁盘iops性能 1.SATA和SAS盘原生IOPS如下: 2.RAID磁盘阵列对应的写惩罚级别: 3.计算功能性IOPS公式如下: 功能性 IOPS=(((总原生 IOPS×写 %))/( ...
- CentOS中使用FIO测试磁盘IO性能
$ yum install fio 0x02 命令 随机读: $ fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randread - ...
- fio测试ceph的filestore
前言 fio是一个适应性非常强的软件,基本上能够模拟所有的IO请求,是目前最全面的一款测试软件,之前在看德国电信的一篇分享的时候,里面就提到了,如果需要测试存储性能,尽量只用一款软件,这样从上层测试到 ...
随机推荐
- 【京东助手】滑稽东试用助手 V1.6.0
很久没写博客了,发个最近在做的一个软件! 滑稽东试用助手现有功能1.自动申请试用2.自动领取京豆3.自动签到领取京豆说明:该软件使用C#开发,若要运行此应用程序,您必须首先安装 .NET4.01.双击 ...
- C++后台服务如何高效实现多个定时器任务
大部分云端的后台服务,经常会使用到定时器功能来检测一些状态值的变化,且当定时器较多时,就需要设计统一的定时器管理模块来维护所有的定时器资源.然而要设计性能良好的定时器和管理模块,是需要一定的经验和技巧 ...
- 学习高性能mysql
Mysql 的InnoDB存储引擎实现的不是简单的行级锁,实现的是MVCC,多版本并发控制,可以理解成行级锁的一个变种. InnoDB的MVCC是通过在每行纪录后面保存两个隐藏的列来实现的.这两个列, ...
- java基础之开发环境配置
一. 环境变量配置的原理 一. 配置环境变量path 如果我们按照上面的来编译和运行的话未免太过于麻烦了,那么在这里我们可以配置环境变量PATH 1.配置环境变量的步骤 这时可以直接来看效果 如果d ...
- ARC102D(构造)
ARC102D(构造) 构造一个图,使得\(n \le 20,m\le 60\),边从小的点连向大的点,并且从1到n的所有路径,长度与\([0, l-1]\)构成双射. 用二进制的思想--代码很鬼畜 ...
- rem原理
rem布局实际上就是实现等比缩放 试想,如果我们的元素在不同的屏幕上可以按照相同的比例来进行缩放就好了. rem的计算原理: 试想把屏幕平均分成10份,那么每一份就是1/10,我们选择每一份的大小是1 ...
- 解决部分在Debug模式下程序没问题但是Release模式下出现问题的方法
编译策略介绍 关于优化级别:GCC_OPTIMIZATION_LEVEL 描述如下 None: Do not optimize. [-O0]With this setting, the compil ...
- springboot整合xxl-mq学习笔记
首先xxl-mq是大神xuxueli开发的一个消息中间件框架: 与springboot整合过程: <?xml version="1.0" encoding="UTF ...
- springboot整合dubbo注解方式(三)
笔者用自己代码测试时候发现这个版本信息,可以没有,也可以制定一个就可以了,没有太大的问题,只是需要注意引入的依赖问题,两个jar与一个jar的问题, 然后就是接口公共依赖问题,案例是把我找的几个案例进 ...
- 关于c语言的位运算&,|,^(看懂汉字的都能看懂)
其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的 ...