cgroup测试存储设备IOPS分配
1 使用:创建树并且attach子系统
- 首先要创建文件系统的挂载点作为树的根
mkdir /cgroup/name
mkdir /cgroup/cpu_and_mem
- Mount这个挂载点到一个或者多个子系统
mount -t cgroup -o subsystems name /cgroup/name
mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
- 这个时候查看子系统
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
- 重新mount
mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_mem
- 查看子系统
~]# lssubsys -am
cpu,cpuacct,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
devices
freezer
blkio
- 创建子group: mkdir /cgroup/hierarchy/name/child_name
- mkdir /cgroup/cpuset/lab1/group1
使用:Process Behavior in the Root Control Group
对于blkio和cpu子系统来说,在root cgroup下的进程和在子cgroup下的进程,对资源的分配不同
例如有一个root cgroup,文件夹为/rootgroup,有两个子cgroup,/rootgroup/red/ and /rootgroup/blue/
在这三个cgroup下面都创建cpu.shares,并且值设为1 如果在三个cgroup下面各创建一个进程,则每个进程CPU占有率为三分之一
然而当子cgroup里面添加更多的进程,则整个子cgroup还是占有三分之一的CPU
如果在root cgroup里面再创建两个进程,则变成了按照进程数来分,也即每个进程五分之一
所以在使用blkio和cpu的时候,尽量使用子cgroup
子系统:blkio
子系统控制并监控cgroup中的任务对块设备的I/O访问。
blkio.weight
指定cgroup默认可用访问块I/O的相对比例(加权),范围在100到1000
blkio.weight_device
指定对cgroup中可用的具体设备I/O访问的相对比例(加权),范围是100到 1000。
blkio.throttle.read_bps_device
the upper limit on the number of read operations a device can perform. Entries have three fields: major, minor, and bytes_per_second.
blkio.throttle.write_bps_device
the upper limit on the number of write operations a device can perform.

随着包括存储设备在内服务器的能力越来越高,特别是用上了PCIe存储卡后,IOPS能力通常有10几万,马上过剩。在这种情况下,一台服务器可以干很多事情,在上面跑很多服务。那么如何保证系统的服务质量是个很重要的事情了。
我们在下来的的项目中倾向于用cgroup来做资源的隔离和限制,原因是cgroup的开销很小,而且很易用。cgroup 可以参考这里
我们特别关心cgroup的blkio子模块,他有2种限制模式:
1. throttle,限制每个进程能使用的IOPS或者吞吐量。
2. weight,现在每个进程能使用的IOPS的能力的比例,必须通过CFQ调度器来实现。
文档和具体的参数可以看上面提到的cgroup文档。
要使用blkio的weight限制需要注意几个事情:
1. 必须走directio, 如果buffered io因为最终写IO的进程不是发起IO的进程,结果会有很大的偏差。
2. 调度器必须是CFQ。
3. 测试工具必须支持cgroup的相关限制。
4. 最好是随机的IO。
这里只是粗粗演示下如何用fio按照比例来限制进程使用的IO, 我们来构造下场景:
我们在创建2个1g大小的文件,进行随机的混合读写,一个给500的比例,一个给100的比例,总的比例是1000。那么理论上可以看到A进程可以得到多于B进程5倍的IO能力。
操作如下:
$ cat test.fio
[global]
bs=4k
ioengine=libaio
iodepth=
direct=
rw=randrw
rwmixread=
time_based
runtime=
cgroup_nodelete= [test1]
filename=test1.dat
size=1G
cgroup_weight=
cgroup=test1 [test2]
filename=test2.dat
size=1G
cgroup_weight=
cgroup=test2 $ cat /sys/block/sda/queue/scheduler
noop deadline [cfq] $ sudo fio test.fio
test1: (g=): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=
test2: (g=): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=
fio 2.0
Starting processes
Jobs: (f=): [mm] [5.5% done] [618K/90K /s] [ / iops] [eta 02m:51s]
...
我们从另外一个终端可以看到IO能力的分配情况:
$ sudo lssubsys -am
cpuset
net_cls
perf_event
cpu /sys/fs/cgroup/cpu
cpuacct /sys/fs/cgroup/cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
blkio /sys/fs/cgroup/blkio
$ pgrep -x fio $ cat /sys/fs/cgroup/blkio/test1/tasks $ cat /sys/fs/cgroup/blkio/test2/tasks $ sudo iotop

差不多是5:1的比例,符合预期。
我们在使用的时候会担心kernel的稳定性,所以用fio能够大压力,长时间的来测试cgroup模块的可靠性,收集数据作为应用的参考。
祝玩得开心!
cgroup测试存储设备IOPS分配的更多相关文章
- 实战DeviceIoControl 之五:列举已安装的存储设备
Q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用CreateFile打开设备,进行它所支持的I/O操作了.如果事先并不能确切知道设备名,如何去访问设备呢? A 访问设备 ...
- RAMCloud:内存云存储的内存分配机制
现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...
- 通过数据库评估存储设备IO性能-Oracle11gIO校准功能介绍
通过数据库评估存储设备IO性能 ---------Oracle11g IO校准功能介绍 前言 I/O子系统是ORACLE数据库的一个重要组成部分,因为I/O操作是贯穿数据库管理全过程,它操作的对象包括 ...
- KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- 将windows系统装到USB存储设备
需求: 1)一般公司比较规范,计算机系统有严格的限制策略,如果自己不懂得如何更改或者没有权限更改,将极其不便. 2)计划在家里完成在公司未完成的事,甚至异地出差觉得携带笔记本不太方便,寻找更便携的设备 ...
- 存储设备的DDP功能详解
http://blog.csdn.net/u013394982/article/details/18259015 DDP功能,即Dynamic Disk Pool,它是除了现有的RAID0,1,10, ...
- KVM(四) I/O 设备直接分配和 SR-IOV
(4):I/O 设备直接分配和 SR-IOV 本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较. 1. PCI/PCI-E ...
- ubuntu14.04禁用USB外存储设备
ubuntu 14.04中禁用usb外存储设备: 在网上找了很多方法,大概都是下面的命令,而实际测试的时候没有什么作用. gsettings set org.gnome.desktop.media-h ...
- 树莓派USB存储设备自动挂载并通过脚本实现自动拷贝,自动播放视频,脚本自动升级等功能
需求:首先需要树莓派自动挂载USB设备,然后扫描USB指定目录下文件,将相关文件拷贝至树莓派指定目录,然后通过omxplayer循环播放新拷贝文件视频 1. 树莓派实现USB存储设备自动挂载 树莓派U ...
随机推荐
- 浏览器根对象document之方法概述
1.1 节点 筛选 getRootNode返回上下文的根节点. querySelector返回文档中匹配指定 CSS 选择器的第一个元素. querySelectorAll返回文档中匹配指定 CSS ...
- opencv图像处理基础 (《OpenCV编程入门--毛星云》学习笔记一---五章)
#include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...
- OpenGL学习--01--打开一个窗口
// Include standard headers #include <stdio.h> #include <stdlib.h> // Include GLEW #incl ...
- 安装部署OpenPAI + VSCode 提交
========================================================== 安装openpai请参考这篇 https://www.cnblogs.com/ji ...
- Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...
- maven 安装与配置最佳实践
配置Maven环境变量 1.新建 maven home 环境变量 变量名:M2_HOME 变量值:D:\ProgramFiles\apache-maven-3.5.4 2 ...
- Python Socket实现简单web服务器
#!/usr/bin/python env # coding:utf-8 import socket ip_port = ('127.0.0.1', 80) back_log = 10 buffer_ ...
- Week7——JSON
1.什么是JSON? JSON是JavaScript对象表示法,全称是JavaScript Objec Notation.它是存储和交换文本信息的语法,类似于XML.JSON是轻量级的文本数据交换格式 ...
- 多线程应用-类(thread)
在对class thread加锁时,锁无法正常应用,函数方式没问题. 在使用class thread方法时,并发后的查询结果不对,函数方式没问题. # -*- coding: UTF-8 -*- fr ...
- CSS-定位属性
Css学习——定位属性 定位可以看作是一种分层,通过对页面中的各种元素进行定位,可以将某些元素放到其他元素的上层,并在浏览器的窗口中设置这些元素的具体位置. position属性以及Css所提供的4中 ...