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. 行内元素和块级元素的具体区别是什么?inline-block是什么?(面试题目)

    一,行内元素与块级元素的区别: 1.行内元素与块级元素直观上的区别二.行内元素与块级元素的三个区别 行内元素会在一条直线上排列(默认宽度只与内容有关),都是同一行的,水平方向排列. 块级元素各占据一行 ...

  2. RabbitMQ,Windows环境下安装搭建

    切入正题:RabbitMQ的Windows环境下安装搭建 一.首先安装otp_win64_20.1.exe,,, 二.然后安装,rabbitmq-server-3.6.12.exe, 安装完成后,在服 ...

  3. 风云2号云图Mosaic Dataset处理

    # ---------------------------------------------------------------------------# -*- coding: utf-8 -*- ...

  4. 谷歌新Logo如何做到只有305字节

    谷歌新旧Logo 谷歌换logo已经有一段时间了,对于更换Logo的问题,大家讨论的最多的是到底新老Logo哪个更好看. 但也有个别同学注意到了一个事实:谷歌的新Logo只有305字节那么大,而老的L ...

  5. Scala安装时的坑

    重新安装了Scala(2.11.12版本)到d:\Program Files下,查看版本时,报如下异常: 百度了一下,竟然是不允许空格,太low了. 装到d:\Scala后问题解决

  6. angr 学习笔记

    前言 angr 是一个基于 符号执行 和 模拟执行 的二进制框架,可以用在很多的场景,比如逆向分析,漏洞挖掘等.本文对他的学习做一个总结. 安装 这里介绍 ubuntu 下的安装,其他平台可以看 官方 ...

  7. Oracle SQL_TRACE使用小结

    一.关于基础表Oc_COJ^c680758 rd-A6z/&[1R1] H680758 Oracle10G之前,启用AUTOTRACE功能需要手工创建plan_table表,创建脚本为$ORA ...

  8. 6_1 持久化模型与再次加载_探讨(1)_三种持久化模型加载方式以及import_meta_graph方式加载持久化模型会存在的变量管理命名混淆的问题

    笔者提交到gitHub上的问题描述地址是:https://github.com/tensorflow/tensorflow/issues/20140 三种持久化模型加载方式的一个小结论 加载持久化模型 ...

  9. python函数修饰器(decorator)

    python语言本身具有丰富的功能和表达语法,其中修饰器是一个非常有用的功能.在设计模式中,decorator能够在无需直接使用子类的方式来动态地修正一个函数,类或者类的方法的功能.当你希望在不修改函 ...

  10. Sql语法高级应用之三:存储过程

    一.存储过程概述 SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便的从系统表中查询信息,或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQ ...