《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #10 Fair Group Scheduling

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

时间: 2024-09-15 23:29:38

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

《Linux内核精髓:精通Linux内核必会的75个绝技》一导读

前 言 内核是操作系统的核心,操作系统的基本功能都是由内核提供的.文件生成和数据包传输等也是通过内核的功能实现的.但这些都不是简单的任务.平时可能意识不到,但这其中确实包含了很多先进技术.例如,在文件系统方面,配置文件时尽量减少磁盘扫描,在网络方面,由于路由表的入口数量庞大,因此设计时尽量保证对系统整体影响较小的设计.在内存管理.进程管理方面也作出了很多努力.解读这种先进技术也是内核构建的魅力之一. 然而,最近的Linux所提供的并不只有基本功能.随着功能的不断发展,现在已经出现了很多特定领域的

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

HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法. "获取内核"这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各种衍生版本的意义. 接下来将简单介绍Linux内核的开发模式,并分析各种衍生版本在其中所处的地位,然后介绍获取这些衍生版本的源代码的方法. 内核的种类 想要获取正确的Linux内核源代码,首先必须了解Linux内核的开发模式. Linux内核是由多个开发者以分散型的模式进行开发的.这里出

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

HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap. ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行压缩后,不是写入磁盘,而是写入内存.可以使用的内存仅为完成压缩的部分.压缩处理使用的是LZO注1. ramzswap是从Linux 2.6.33合并到Staging驱动程序的.Staging驱动程序是指尚未达到某种程度的质量的试验性驱动程序. 通过使用ramzswap,运转速度可以比换出到一般磁盘

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

HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构-内核模块的编写方法. 内核模块 Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在一个内核空间内.但是内核具有模块功能,可以将磁盘驱动程序.文件系统等独立的内核功能制作成模块,并动态添加到内核空间或者删除. 内核模块是可以动态添加到Linux内核空间的二进制文件,文件扩展名为ko. 内核模块的编写方法大致有两种.一种是将内核源码树带有的功能编写为模块的方法(参考Hack #2

《Linux内核精髓:精通Linux内核必会的75个绝技》一第1章 内核入门

第1章 内核入门 一提起内核包,总会让人感觉似乎困难至极.如临深渊一般.但其基本的操作与其他开放源代码软件包并没有什么不一样,都是首先获取源代码,进行解读,然后修改或者添加新功能对应的代码,并编译.测试.本章将介绍这些内核包操作中最基础的知识,以及Linux内核特有的方法.

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

HACK #9 RT Group Scheduling 与RT Throttling 本节介绍对实时进程所使用的CPU时间进行限制的功能RT Group Scheduling和RT Throttling.RT Group Scheduling和RT Throttling功能是用来限制使用实时调度策略的进程的CPU时间.内核2.6.25以后的版本都可以使用这个功能.本节将介绍如何使用RT Scheduling和RT Throttling来限制实时进程的CPU时间.为了让Linux系统能够应用到需要

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #8 调度策略

HACK #8 调度策略 本节介绍Linux的调度策略(scheduling policy). Linux调度策略的类别大致可以分为TSS(Time Sharing System,分时系统)和实时系统这两种. 一方面,一般的进程是通过分时运行的.也就是说,使用CPU的时间达到分配给进程的时间(时间片)时,就会切换到其他进程.这种分时运行的调度策略称为TSS. 另一方面,在实时制约较严格且要求保证实时的处理中,就需要指定静态的执行优先级,并严格按照执行优先级进行调度.对这种对应答性有要求的进程,可

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #4 如何使用Git

HACK #4 如何使用Git 本节介绍Git的使用方法. Git是Linux内核等众多OSS(Open Source Software,开源软件)开发中所使用的SCM(Source Code Management,源码管理)系统.在2005年以前,在Linux内核开发中一直使用一个叫做BitKeeper的SCM.但是由于后来BitKeeper的许可证被更改,可能会对开发造成障碍,因此Linux不得不改用新的SCM进行开发.在这种情况下,Linux内核的创始人Linus Torvalds就开发了

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核

HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法. 当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功能或者驱动程序时,或者相反地,想要删除不需要的功能从而使内核更精简.更快时,或者想使用最新版的上游内核时,也需要对内核进行编译. 下面主要介绍对上游内核进行设置.编译以及安装的方法.当使用发布版内核的源码包管理系统来管理内核映像文件时,需要将内核映像文件打包.接下来以两个具有代表性的发布版Fedo