HACK #10 Fair Group Scheduling

本节介绍Cgroup之一、管理CPU资源的Fair Group Scheduling。
Fair Group Scheduling
Fair Group Scheduling是Cgroup的资源管理之一,用来控制Linux内核的进程调度程序进行的CPU时间分配。与其他Cgroup进行的资源管理一样,可以对每个特定进程组进行资源(CPU分配时间)管理。使用这个功能,就可以在分组间对CPU分配时间进行调整。
另外,Fair Group Scheduling使用的是Linux 2.6.23以后引入的CFS(Completely Fair Scheduler)的CPU分配时间控制功能,因此在没有安装CFS的Linux 2.6.23之前版本的内核中不能使用。因此,本节介绍怎样通过CFS对非实时调度策略进程的CPU分配进行控制。
Fair Group Scheduling的使用方法
下面通过实例来讲解Fair Group Scheduling的使用方法。
使用前,需要挂载和安装Cgroup文件系统。由于使用了Cgroup进行资源控制,因此挂载时需要启用CPU资源控制。

# mount -t cgroup -o cpu cgroup /cgroup

在本示例中将创建两个控制CPU资源的分组,分别为GroupA、GroupB。

# mkdir /cgroup/GroupA
# mkdir /cgroup/GroupB

为GroupA、GroupB这两个分组分配进程,从而在各分组间公平分享CPU时间。也就是说,GroupA和GroupB的CPU使用率都是50%。
然后,确认一下实际的CPU时间分配是否公平。打开一个新的终端,将shell进程分配给GroupA。

# echo
$$
> /cgroup/GroupA/tasks

然后,在这个shell上形成死循环,使CPU利用率达到100%。

# while :; do true; done

接着,向GroupB分配新的shell进程,在shell上形成死循环,使GroupB中的CPU使用率也达到100%。

# echo
$$
> /cgroup/GroupB/tasks
# while :; do true; done

在这个状态下使用top命令确认CPU使用率,可以发现各分组中shell(bash)的CPU使用率基本都是50%,GroupA和GroupB分别使用一半的CPU资源。

top - 03:53:13 up 1 day, 19:07,  4 users,  load average: 1.35, 0.42, 0.14
Tasks: 115 total, 3 running, 112 sleeping, 0 stopped, 0 zombie
Cpu(s):100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1021532k total, 497896k used, 523636k free, 80220k buffers
Swap: 2064376k total, 0k used, 2064376k free, 204004k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8333 root 20 0 105m 1856 1444 R 50.2 0.2 0:37.83 bash
8342 root 20 0 105m 1820 1424 R 49.9 0.2 0:32.43 bash

然后,向其中一个分组添加进程,并确认分组间(GroupA和GroupB)的CPU资源分配为各50%。
打开一个新的终端,向GroupB添加shell进程。同样,在这个shell上形成死循环,使CPU使用率达到100%。

# echo
$$
> /cgroup/GroupB/tasks
# while :; do true; done

这时使用top命令将显示下列结果。

top - 03:54:07 up 1 day, 19:08,  4 users,  load average: 1.89, 0.71, 0.25
Tasks: 115 total, 4 running, 111 sleeping, 0 stopped, 0 zombie
Cpu(s):100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1021532k total, 497896k used, 523636k free, 80228k buffers
Swap: 2064376k total, 0k used, 2064376k free, 204008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8333 root 20 0 105m 1856 1444 R 49.9 0.2 1:04.86 bash
8342 root 20 0 105m 1820 1424 R 24.9 0.2 0:57.64 bash
8354 root 20 0 105m 1852 1448 R 24.9 0.2 0:01.82 bash

可以看出GroupA和GroupB都为50%,并且GroupB中的两个shell进程也各占25%。
再确认一下,是否即使再向GroupB添加其他进程,也不会对分配给GroupA的CPU时间产生影响。
同样,添加终端,将shell分配给GroupB,并形成死循环。

# echo
$$
> /cgroup/GroupB/tasks
# while :; do true; done

从top命令的结果可以看出,向GroupA分配了50%,剩下的50%被GroupB的3个进程均分。

top - 03:57:11 up 1 day, 19:11,  5 users,  load average: 3.22, 1.88, 0.79
Tasks: 116 total, 5 running, 111 sleeping, 0 stopped, 0 zombie
Cpu(s): 99.7%us, 0.3%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1021532k total, 498648k used, 522884k free, 80260k buffers
Swap: 2064376k total, 0k used, 2064376k free, 204008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8333 root 20 0 105m 1856 1444 R 49.9 0.2 2:38.69 bash
8342 root 20 0 105m 1824 1424 R 16.9 0.2 1:36.27 bash
8354 root 20 0 105m 1856 1448 R 16.6 0.2 0:39.11 bash
8368 root 20 0 105m 1824 1424 R 16.6 0.2 0:14.23 bash

以上就是在分组间平分CPU资源的方法。
cpu.shares
下面介绍cpu.shares特殊文件。在启用CPU资源控制的Cgroup文件系统中,为Fair Group Scheduling准备了cpu.shares文件。

# ls /cgroup/GroupA
cgroup.procs cpu.rt_runtime_us notify_on_release
cpu.rt_period_us cpu.shares tasks

在cpu.shares文件中,可以对进程调度程序所处理的进程组设置CPU时间分配的比重。通过修改这个值,就可以在分组间调整CPU时间的比例。默认值为1024。

# cat /cgroup/GroupA/cpu.shares

1024
这里将GroupB的cpu.shares设置为GroupA的一半,即512。

# echo 512> /cgroup/GroupB/cpu.shares

在CPU资源分配中,GroupA的比重变为1024,GroupB的比重变为512。因此,分配给GroupA的时间就是GroupB的2倍。使用top命令,确认分配给刚才启动的shell进程的CPU资源。

top - 04:07:40 up 1 day, 19:22,  5 users,  load average: 4.00, 3.73, 2.34
Tasks: 116 total, 5 running, 111 sleeping, 0 stopped, 0 zombie
Cpu(s):100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1021532k total, 481024k used, 540508k free, 80348k buffers
Swap: 2064376k total, 0k used, 2064376k free, 204012k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8333 root 20 0 105m 1856 1444 R 66.5 0.2 7:54.18 bash
8342 root 20 0 105m 1824 1424 R 11.3 0.2 3:20.07 bash
8354 root 20 0 105m 1856 1448 R 11.0 0.2 2:22.90 bash
8368 root 20 0 105m 1824 1424 R 11.0 0.2 1:58.02 bash

可以发现,GroupA变成66%,GroupB变成33%,并且在GroupB中,3个shell进程分别占用11%。
小结
本节介绍了Fair Group Scheduling。它能以进程组为单位控制CPU资源分配,将CPU时间平分给多个用户,使特定处理不会对其他处理造成一定程度上的影响。
—Hiroshi Shimamoto

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #10 Fair Group Scheduling的更多相关文章

  1. 《Linux内核精髓:精通Linux内核必会的75个绝技》目录

    1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检 ...

  2. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

    HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...

  3. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap

    HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap.ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行 ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #9 RT Group Scheduling 与RT Throttling

    HACK #9 RT Group Scheduling 与RT Throttling 本节介绍对实时进程所使用的CPU时间进行限制的功能RT Group Scheduling和RT Throttlin ...

  5. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

    HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE

    HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...

  7. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #20 使用fio进行I/O的基准测试

    HACK #20 使用fio进行I/O的基准测试 本节介绍使用fio进行模拟各种情况的I/O基准测试的操作方法.I/O的基准测试中有无数需要考虑的因素.是I/O依次访问还是随机访问?是通过read/w ...

  8. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4

    HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...

  9. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #16 OOM Killer的运行与结构

    HACK #16 OOM Killer的运行与结构(1) 本节介绍OOM Killer的运行与结构. Linux中的Out Of Memory(OOM) Killer功能作为确保内存的最终手段,可以在 ...

随机推荐

  1. C#中标准Dispose模式的实现(转载)

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:w ...

  2. postman 安装桌面版

    https://github.com/postmanlabs/postman-app-support

  3. CentOS6.4_x86_120g__20160306.rar

    安装的镜像包: CentOS-6.4-i386-bin-DVD1to2(CentOS-6.4-i386-bin-DVD1.iso / CentOS-6.4-i386-bin-DVD2.iso) 1. ...

  4. ACM比赛学习指导(20180223)

    0.比赛介绍 (1)浙江省大学生程序设计比赛,3人一组,题目为英文 (2)ACM程序设计比赛 百度百科介绍 1.理论学习 (1)<挑战程序设计竞赛>,秋叶拓哉,巫泽俊 (2)<算法竞 ...

  5. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  6. 【LeetCode 222_完全二叉树_遍历】Count Complete Tree Nodes

    解法一:递归 int countNodes(TreeNode* root) { if (root == NULL) ; TreeNode *pLeft = root->left; TreeNod ...

  7. 免费获取半年 Bitdefender Total Security 2014

    免费获取半年 Bitdefender Total Security 2014,安装后剩余 200 天使用期.安装程序语言是德语,调包下安装语言应该也是可以的? 目前德国活动,Bitdefender T ...

  8. windows下 两个版本的JDK环境变量进行切换 MARK

    我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,为了简化操作,我们可以通过批处理文件来完成环境变量切换的任务.使用方法:阅读代码我们就会 ...

  9. LNMP环境下独立安装Mysql5.7.18 并对数据库文件进行本地物理迁移 (需暂停数据库服务方式)

    前几天读研时候的同学要我帮忙给解决一个问题,就是Redhat服务器下面安装了LNMP,并且由于分区的划分不当导致MySQL数据库中存放数据库的盘区内空间被急剧消耗,由于该应用主要是数据分析及备份所用, ...

  10. BZOJ5091: [Lydsy1711月赛]摘苹果(简单概率)

    5091: [Lydsy1711月赛]摘苹果 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 214  Solved: 163[Submit][Statu ...