Linux资源管理-IO优先级,linux-io优先级


前一篇博客介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法.

 

前提条件

如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.

CONFIG_BLK_CGROUP=y
CONFIG_CFQ_GROUP_IOSCHED=y

查看是否开启这2个内核编译选项的方法很简单:

root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`
root@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`

如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.

 

再次通过 /proc/cgroups 来查看 blkio 是否已经启用.

root@debian-113:~# cat /proc/cgroups 
#subsys_name    hierarchy    num_cgroups    enabled
cpuset    0    1    1
cpu    0    1    1
cpuacct    0    1    1
memory    0    1    1
devices    0    1    1
freezer    0    1    1
net_cls    0    1    1
blkio    0    1    1    <-- enabled = 1, 说明已经启用
perf_event    0    1    1

如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.

类似的可以参考: Linux资源控制-CPU和内存  中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。

 

除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.

root@debian-113:~# cat /sys/class/block/sda/queue/scheduler 
noop deadline [cfq]

上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.

如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.

如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么

cat cfq /sys/class/block/sda/queue/scheduler     <-- 将当前的IO调度程序设置成 cfq

注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.

 

实例 - 控制IO优先级

 

实验之前, 先制作测试脚本. (简单写了一个如下)

#!/bin/bash

####################################################################
# 1. 创造2个测试文件, 大小都是1G
# 2. 将当前进程加入到指定 cgroup
# 3. 执行 dd 操作
# 4. 删除 测试文件
# 5. 显示log
####################################################################

function usage()
{
    echo "./blkio-test.sh <group1> <group2>"
    exit 1
}

if [ $# != 2 ]; then
    usage
fi

group1_src=~/group1.src
group2_src=~/group2.src

group1_log=/tmp/group1.log
group2_log=/tmp/group2.log

group1=$1
group2=$2

echo "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
dd if=/dev/zero of=$group1_src count=1024 bs=1M
dd if=/dev/zero of=$group2_src count=1024 bs=1M

echo "同时在 $group1 和 $group2 中开始 dd 测试"
echo 3 > /proc/sys/vm/drop_caches
echo $$ >> $group1/tasks
(date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &

echo $$ >> $group2/tasks
(date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &

wait
echo "测试完成!"

echo "开始清除测试文件"
rm -rf $group1_src $group2_src
echo "测试文件清除完成"

echo "------------------------------------------"
echo "显示group1 的log"
cat $group1_log

echo "------------------------------------------"
echo "显示group2 的log"
cat $group2_log

echo "------------------------------------------"

 

开始实验:

# 挂载 cgroup 文件系统
root@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/

root@debian-113:~# mkdir /mnt/cgroup/{A,B}
root@debian-113:~# ll /mnt/cgroup/
total 0
drwxr-xr-x 2 root root 0 Sep  5 13:23 A
drwxr-xr-x 2 root root 0 Sep  5 13:23 B
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_merged
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_queued
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_bytes
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_serviced
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_time
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_wait_time
--w------- 1 root root 0 Sep  5 13:23 blkio.reset_stats
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.sectors
-r--r--r-- 1 root root 0 Sep  5 13:23 blkio.time
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight   <-- 这个就是设置IO优先级的文件
-rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight_device
-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.clone_children
--w--w--w- 1 root root 0 Sep  5 13:23 cgroup.event_control
-rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.procs
-rw-r--r-- 1 root root 0 Sep  5 13:23 notify_on_release
-rw-r--r-- 1 root root 0 Sep  5 13:23 release_agent
-rw-r--r-- 1 root root 0 Sep  5 13:23 tasks

# 默认2个组内的IO优先级都是500
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
500  <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
500

# 默认情况下的测试结果如下: A和B耗时都是 20秒
root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
测试完成!
开始清除测试文件
测试文件清除完成
------------------------------------------
显示group1 的log
Fri Sep  5 13:26:31 CST 2014
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
Fri Sep  5 13:26:51 CST 2014
------------------------------------------
显示group2 的log
Fri Sep  5 13:26:31 CST 2014
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
Fri Sep  5 13:26:51 CST 2014
------------------------------------------

# 修改A的优先级为100, B的优先级为1000
root@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight
root@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight
root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
100
root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
1000

# 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒
root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
测试完成!
开始清除测试文件
测试文件清除完成
------------------------------------------
显示group1 的log
Fri Sep  5 13:30:06 CST 2014
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s
Fri Sep  5 13:30:25 CST 2014
------------------------------------------
显示group2 的log
Fri Sep  5 13:30:06 CST 2014
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s
Fri Sep  5 13:30:17 CST 2014
------------------------------------------

 

可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.

 

总结

其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件.

各个文件的具体含义, 请参考更详细的 cgroup 相关文档.


有哪种系统是进程优先级数值大的优先级高的? linux系统进程优先级最高优先级是-20,最低优先级是19?

你所说的linux系统的优先级数确实是这样的。需要注意的是普通用户只能在0~19之间调整应用程序的优先权值,只有超级用户有权调整更高的优先权值(从-20~19)。linux系统属于这种数值越小优先级越高,数值越大优先级越低的系统。windows属于那种优先数值大的优先级高的系统。其他的就不大清楚
 

linux资源是怎管理的? 要详细点的快

资源管理器:为了确保分配给作业合适的资源,集群资源管理需要维护一个数据库。这个数据库记录了集群系统中各种资源的属性和状态、所有用户提交的请求和正在运行的作业。策略管理器根据这些数据和指定的调度策略生成优先级列表。资源管理器根据这个优先级列表调度作业。资源管理器还应该具有资源预留能力。这样不仅可以保留强大的资源给需要的作业,而且可以预留一定的冗余资源以应付集群中的结点失效和突发的计算。
作业调度策略管理器:策略管理器根据资源管理器得到各个结点上的资源状况和系统的作业信息生成一个优先级列表。这个列表告诉资源管理器何时在哪些结点上运行哪个作业。策略管理器不仅要提供一个复杂的参数集合去定义计算环境和作业,而且要为这个定义提供简捷灵活的表达方式以允许系统管理员实现策略驱动的资源调度。
2 Beowulf集群中的作业管理软件
有很多种选择去管理集群系统中的资源。其中PBS资源管理器和Maui作业调度器最适合集群系统。

2.1 PBS
PBS(Portable Batch System)是由NASA开发的灵活的批处理系统。它被用于集群系统、超级计算机和大规模并行系统。PBS主要有如下特征:

易用性:为所有的资源提供统一的接口,易于配置以满足不同系统的需求,灵活的作业调度器允许不同系统采用自己的调度策略。
移植性:符合POSIX 1003.2标准,可以用于shell和批处理等各种环境。
适配性:可以适配与各种管理策略,并提供可扩展的认证和安全模型。支持广域网上的负载的动态分发和建立在多个物理位置不同的实体上的虚拟组织。
灵活性:支持交互和批处理作业。
OpenPBS( www.OpenPBS.org/)是PBS的Open Source的实现。商业版本的PBS可以参照: www.pbspro.com/。

2.2 Maui
Maui 是一个高级的作业调度器。它采用积极的调度策略优化资源的利用和减少作业的响应时间。Maui的资源和负载管理允许高级的参数配置:作业优先级(Job Priority)、调度和分配(Scheduling and Allocation)、公平性和公平共享(Fairness and Fairshare)和预留策略(Reservation Policy)。Maui的QoS机制允许资源和服务的直接传递、策略解除(Policy Exemption)和指定特征的受限访问。Maui采用高级的资源预留架构可以保证精确控制资源何时、何地、被谁、怎样使用。Maui的预留架构完全支持非入侵式的元调度。

Maui的设计得益于世界最大的高性能计算中心的经验。Maui本身也提供测试工具和模拟器用于估计和调节系统性能。

Maui需要资源管理器与其配合使用。我们可以把Maui想象为PBS中的一个插入部件。

更多Maui的信息可以访问: www.supercluster.org

3 集群系统管理
从系统组成角度说,集群系统是......余下全文>>
 

相关内容

    暂无相关文章