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分配的更多相关文章

  1. 实战DeviceIoControl 之五:列举已安装的存储设备

    Q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用CreateFile打开设备,进行它所支持的I/O操作了.如果事先并不能确切知道设备名,如何去访问设备呢? A 访问设备 ...

  2. RAMCloud:内存云存储的内存分配机制

    现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...

  3. 通过数据库评估存储设备IO性能-Oracle11gIO校准功能介绍

    通过数据库评估存储设备IO性能 ---------Oracle11g IO校准功能介绍 前言 I/O子系统是ORACLE数据库的一个重要组成部分,因为I/O操作是贯穿数据库管理全过程,它操作的对象包括 ...

  4. 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设备直接分 ...

  5. 将windows系统装到USB存储设备

    需求: 1)一般公司比较规范,计算机系统有严格的限制策略,如果自己不懂得如何更改或者没有权限更改,将极其不便. 2)计划在家里完成在公司未完成的事,甚至异地出差觉得携带笔记本不太方便,寻找更便携的设备 ...

  6. 存储设备的DDP功能详解

    http://blog.csdn.net/u013394982/article/details/18259015 DDP功能,即Dynamic Disk Pool,它是除了现有的RAID0,1,10, ...

  7. KVM(四) I/O 设备直接分配和 SR-IOV

    (4):I/O 设备直接分配和 SR-IOV 本文将分析 PCI/PCIe 设备直接分配(Pass-through)和 SR-IOV, 以及三种 I/O 虚拟化方式的比较. 1. PCI/PCI-E ...

  8. ubuntu14.04禁用USB外存储设备

    ubuntu 14.04中禁用usb外存储设备: 在网上找了很多方法,大概都是下面的命令,而实际测试的时候没有什么作用. gsettings set org.gnome.desktop.media-h ...

  9. 树莓派USB存储设备自动挂载并通过脚本实现自动拷贝,自动播放视频,脚本自动升级等功能

    需求:首先需要树莓派自动挂载USB设备,然后扫描USB指定目录下文件,将相关文件拷贝至树莓派指定目录,然后通过omxplayer循环播放新拷贝文件视频 1. 树莓派实现USB存储设备自动挂载 树莓派U ...

随机推荐

  1. druapl7:"Notice: A non well formed numeric value encountered 在 _hierarchical_select_hierarchy_generate() "

    这个是很诡异的一个Notice错误提醒,因为我在Drupal7.54+PHP7.0.1的环境下,并没有报这个错.但是我再Drupal7.59+PHP7.1.7的环境下就报错了.很奇怪,按照报错信息bi ...

  2. Difference between ReLU、LReLU、PReLU、CReLU、ELU、SELU

    激活函数 ReLU.LReLU.PReLU.CReLU.ELU.SELU  的定义和区别 ReLU tensorflow中:tf.nn.relu(features, name=None) LReLU ...

  3. 一起玩转CoordinatorLayout

    作为Material Design风格的重要组件,CoordinatorLayout协调多种组件的联动,实现各种复杂的效果,在实际项目中扮演着越来越重要的角色.本篇博客将由浅到深,带你一起玩转Coor ...

  4. Android Dialog的整个生命周期

    Activities提供了一种方便管理的创建.保存.回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog( ...

  5. android设计的布局在阿拉伯语下界面错乱的解决方法

    (1)正在AndroidManifest.xml声明文件的application元素中,增加” android:supportsRtl=true” (2)建] androidの设计的布局在阿拉伯语下界 ...

  6. 《Think in JAVA》之每日一读(initianlize)——2013/11/12、13

    了解包括继承在内的初始化全过程,以对所发生的的一切有一个全局的把握,是很有益的. 请看下例: package initialize; class Insect { private int i = 9; ...

  7. leetCode题解之Self Dividing Numbers

    1.题目描述 2.题目分析 简单题目,只要挨个判断该数是不是满足条件即可. 3.代码 vector<int> selfDividingNumbers(int left, int right ...

  8. 在 Azure 中的 Linux 虚拟机上使用 SSL 证书保护 Web 服务器

    若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Linux 虚 ...

  9. Oracle EBS 附件功能

    SELECT fde.table_name, fde.data_object_code, fdet.user_entity_name, fdet.user_entity_prompt, fat.app ...

  10. 记开发个人图书收藏清单小程序开发(七)DB设计

    前面的书房初始化的前端信息已经完善,所以现在开始实现DB的Script部分. 新增Action:Shelf_Init.sql svc.sql CREATE SCHEMA [svc] AUTHORIZA ...