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

HACK #11cpuset

本节介绍控制物理CPU分配的cpuset。
cpuset是Linux控制组(Cgroup)之一,其功能是指定特定进程或线程所使用的CPU组。另外,除CPU以外,同样还能指定内存节点的分配。
以前的内核具有CPU affinity功能,该功能将线程分配给特定CPU。现在的内核中虽然也有affinity(taskset命令),但推荐使用cpuset。
用法
使用cpuset前,必须通过内核config启用cpuset功能。
CONFIG_CPUSETS=y
最近的发布版在标准中就已启用。cpuset就是作为Cgroup提供的一个功能。因此,使用cpuset时,就需要挂载 Cgroup文件系统。使用下列方法启用cpuset选项,挂载Cgroup后,就可以使用cpuset(参考Hack #7)。

# mount -o cpuset -t cgroup cgroup /cgroup

在这里创建一个新的CPU分配组GroupA。与其他Cgroup同样在挂载的Cgroup下创建新目录GroupA,作为分组GroupA。

# mkdir /cgroup/GroupA

编辑新创建分组GroupA的cpuset,修改CPU分配情况。这里以仅将CPU0分配给分组GroupA的情况为例进行说明。在分组GroupA下的特殊文件cpuset.cpus内写入要分配的CPU编号,使用下列命令,来控制分组的cpuset。

# echo 0 > /cgroup/GroupA/cpuset.cpus

到这一步,就完成了仅使用CPU0作为GroupA的CPU分配的设置。
接下来,在这个分组GroupA中添加进程。这里将当前shell添加到GroupA中。使用下列命令,将PID($$表示shell本身的PID)写入GroupA下的task文件。

# echo $$ > /cgroup/GroupA/task

此后由当前shell启动的进程全部在这个GroupA下,使用的CPU仅限于0号CPU。
现在确认所使用的CPU数量是否受限,以及产生的效果如何。本节显示的是以Fedora 12为例的情况。
本示例中使用的Fedora 12内核如下。

# uname -a
Linux fedora12 2.6.31.12-174.2.22.fc12.x86_64 #1 SMP Fri Feb 19 18:55:03 UTC 2010
x86_64 x86_64 x86_64 GNU/Linux

如果使用cpuset改变所使用的CPU数量会怎么样?比较内核的编译时间。
首先准备好要进行比较的编译。为了避免磁盘性能的影响,首先创建内存文件系统tmpfs,并在其中配置源文件。创建目录/tmp/build,挂载 tmpfs,命令如下所示。

# mkdir /tmp/build
# mount -t tmpfs none /tmp/build

本次测量的是内核源代码每次在创建的tmpfs下解压缩tarball时,使用默认config所花费的内核编译时间。使用的一系列命令行如下。

# cd /tmp/build/
# tar jxf /ext4data/kernel/linux-2.6.33.tar.bz2
# cd linux-2.6.33/
# make defconfig
# time make -j 2

首先测量Linux 2.6.33的编译时间。
将Cgroup挂载到/cgroup,创建分组GroupA。

# mount -o cpuset -t cgroup cgroup /cgroup
# mkdir /cgroup/GroupA

接下来看一下向分组GroupA分配两个CPU时的结果。

# echo"0-1" > /cgroup/GroupA/cpuset.cpus
# echo 0 > /cgroup/GroupA/cpuset.mems   mems默认为空,因此需要填入值
# echo $$ > /cgroup/GroupA/tasks

编译时间如下。

# time make -j 2
real   4m55.568s
user   2m42.066s
sys    5m4.575s

然后将CPU缩减到只有0号CPU。

# echo 0 > /cgroup/GroupA/cpuset.cpus
# echo 0 > /cgroup/GroupA/cpuset.mems
# echo $$ > /cgroup/GroupA/tasks 

# mount -t tmpfs none /tmp/build
# cd /tmp/build/
# tar jxf /ext4data/kernel/linux-2.6.33.tar.bz2
# cd linux-2.6.33/
# make defconfig
# time make -j 2
real    7m44.491s
user    2m47.319s
sys    4m56.737s

可以看到,CPU数量变为1,实际花费的时间(real)增加。
下面以对虚拟化(KVM)进程所使用的CPU进行限制的情况为例,看一下将分配给KVM进程的CPU固定,并确保主机操作系统能够一直使用CPU后,是否能够减少虚拟化的影响。
这个示例同样使用Fedora 12。
首先使用KVM,启动两个客户端操作系统。然后,在客户端操作系统中循环进行内核编译,加大CPU负载。
在解压缩Linux 2.6.33源代码的目录下,无限循环执行make clean和make命令,增加客户端操作系统的CPU负载。

hshimamoto@ubuntu:~/kernel/linux-2.6.33$ while :; do make clean; time make; done
hshimamoto@opensuse:~/kernel/linux-2.6.33> while :; do make clean; time make; done

在这种情况下计算主机操作系统上的内核编译时间。同前例一样,需要创建tmpfs,消除磁盘性能的影响后再进行测量。计算结果如下。

# time make -j 2
real    8m20.468s
user    2m45.890s
sys     4m51.091s

然后,将KVM的qemu-kvm进程可以使用的CPU设置为只有0号CPU。

# mount -o cpuset -t cgroup cgroup /cgroup
# mkdir /cgroup/kvm

# echo 0 > /cgroup/kvm/cpuset.meme  将kvm分组的cpuset设为只有0
# echo 0 > /cgroup/kvm/cpuset.cpus

将启动中的qemu-kvm移动到kvm分组。

# ps x | grep qemu
 2495 pts/2    Sl+  238:37 qemu-kvm
 2628 pts/3    Sl+  255:33 qemu-kvm

# for i in '\ls /proc/2495/task/'; do echo $i > /cgroup/kvm/tasks; done
# for i in '\ls /proc/2628/task/'; do echo $i > /cgroup/kvm/tasks; done

另外,ksmd(参考Hack #36)也使用CPU,因此这里也将其加入kvm分组。

# ps ux | grep ksmd
root     35  2.2  0.0     0   0?     SN   Mar23 119:42[ksmd]

# echo 35 > /cgroup/kvm/tasks

现在,主机操作系统的内核编译时间就变成如下所示。

# time make -j 2

real    7m55.081s
user    2m43.303s
sys     5m12.039s

可以发现,内核编译所花费的实际时间减少了接近30秒。
这是因为虚拟化的KVM进程只在CPU0上运行,在主机操作系统上就可以使用100%的CPU。
小结
本节介绍了使用Linux中的Cgroup的cpuset。通过使用这个功能,就可以限制特定进程所使用的CPU。从另一个角度来看,通过固定使用的CPU,还可以提高缓存的利用效率和性能。
—Hiroshi Shimamoto

时间: 2024-10-26 23:30:20

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #11cpuset的相关文章

《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个绝技》一导读

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

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

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

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

HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法. ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ext4作为标准文件系统. 除了间接参照块管理以外,ext4还以扩展形式支持块的管理,使其能够处理更大的文件.文件系统.另外,还增加了确保多块(multiblock)注1.确保延迟块.提高fsck速度.碎片整理等新的功能.在ext3中,时间戳(time stamp)的单位为毫秒,而ext4中变成了纳秒