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限制

  1. 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资源上限的场景。

  1. 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测试)的更多相关文章

  1. 硬盘测试工具fio用法总结

    一  fio介绍 linux下的一种常用的磁盘测试工具,支持裸盘和文件形式进行测试   二  硬盘测试常用名词 延迟:io的发起到返回写入成功的时间成为延迟,fio中延迟分为lat,slat,clat ...

  2. 云计算&存储测试:FIO工具入门与实战

    一.关于FIO 1.1 简介 FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘的IO性能,也可测试cpu,nic的IO性能.它可以支持13种不同的I/O引擎,包括:sync,mmap, lib ...

  3. linux使用FIO测试磁盘的iops 【转载】

     linux使用FIO测试磁盘的iops 2013-09-23 10:59:21 分类: LINUX FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括 ...

  4. IdentityServer4 中文文档 -6- (简介)示例服务器和测试

    IdentityServer4 中文文档 -6- (简介)示例服务器和测试 原文:http://docs.identityserver.io/en/release/intro/test.html 目 ...

  5. 使用FIO测试磁盘iops

    我们如何衡量一个存储的性能呢?IOPS(Input/Output OperationsPer Second),即每秒进行读写(I/O)操作的次数是国际上通用的存储性能衡量标准,IOPS越高意味着在同一 ...

  6. fio 测试磁盘

    root@rook-test:/# ceph osd status+----+-----------------------------+-------+-------+--------+------ ...

  7. [记录]FIO测试磁盘iops性能

    FIO测试磁盘iops性能 1.SATA和SAS盘原生IOPS如下: 2.RAID磁盘阵列对应的写惩罚级别: 3.计算功能性IOPS公式如下: 功能性 IOPS=(((总原生 IOPS×写 %))/( ...

  8. CentOS中使用FIO测试磁盘IO性能

    $ yum install fio 0x02 命令 随机读: $ fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randread - ...

  9. fio测试ceph的filestore

    前言 fio是一个适应性非常强的软件,基本上能够模拟所有的IO请求,是目前最全面的一款测试软件,之前在看德国电信的一篇分享的时候,里面就提到了,如果需要测试存储性能,尽量只用一款软件,这样从上层测试到 ...

随机推荐

  1. C# 三元运算

    x=,y=; z=x>y? : 结果z= x=,y=; z=x>y? : 结果z=

  2. Java实现终止线程池中正在运行的定时任务

    源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...

  3. jQuery到Vue的迁移之路

    背景 在前段时间做了L10的某个超复杂超多坑的三端专题之后,组里的小伙伴们一致认为是时候想办法统一一下组里的开发模式了.因为用nie那一套jQuery/zepto(下文jQuery默认包括zepto) ...

  4. 100个大型机器学习数据集汇总(CV/NLP/音频方向)

    网站首页: 网址:数据集

  5. Python lib库docker-py和docker的区别

    1)两者的安装方式 pip install docker A Python library for the Docker Engine API pip install docker-py A Pyth ...

  6. vue框架搭建的详细步骤之项目结构(二)

    上一篇中简单的创建了一个脚手架,这篇简单的讲一下脚手架的项目结构:     (1).build/ 此目录包含开发服务器和生产webpack构建的实际配置.通常,您不需要触摸这些文件,除非您要自定义We ...

  7. Python flask虚拟环境安装

    1.安装virtualenv 2.在当前路径下创建文件夹,启动虚拟环境 3.在使用虚拟环境前需激活,前面出现(env说明在虚拟环境中).虚拟环境中默认安装了pip,所以直接pip安装flask 4.在 ...

  8. 10.8 wtx模拟题题解

    填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...

  9. MYSQL查询字段全部为中文的字段

    在实际使用mysql的过程中,会遇到这样的问题,查询字段内容全部为中文内容的数据,对于刚用mysql的小伙伴可能就比较迷失了,不知道怎么使用,其实这个问题很简单,使用下面这个sql语句就可以了 SEL ...

  10. FPGA实战操作(1) -- SDRAM(Verilog实现)

    对SDRAM基本概念的介绍以及芯片手册说明,请参考上一篇文章SDRAM操作说明. 1. 说明 如图所示为状态机的简化图示,过程大概可以描述为:SDRAM(IS42S16320D)上电初始化完成后,进入 ...