《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
《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #11cpuset的更多相关文章
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核
HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》目录
1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap
HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap.ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块
HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE
HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #20 使用fio进行I/O的基准测试
HACK #20 使用fio进行I/O的基准测试 本节介绍使用fio进行模拟各种情况的I/O基准测试的操作方法.I/O的基准测试中有无数需要考虑的因素.是I/O依次访问还是随机访问?是通过read/w ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4
HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #16 OOM Killer的运行与结构
HACK #16 OOM Killer的运行与结构(1) 本节介绍OOM Killer的运行与结构. Linux中的Out Of Memory(OOM) Killer功能作为确保内存的最终手段,可以在 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #14 虚拟存储子系统的调整
HACK #14 虚拟存储子系统的调整 本节介绍如何使用/proc进行虚拟存储子系统的调整.虚拟空间存储方式在Linux上向应用程序分配内存时,是通过以页面为单位的虚拟存储方式进行的.采用虚拟存储方式 ...
随机推荐
- 在x86为arm 编译 httpd 2.2.31
这个版本的httpd 已经自带 apr apr-util pcre , 不用额外下载源代码 1) 编写环境变量脚本,并执行 cross-env.sh : export ARMROOTFS=/h1roo ...
- JavaScript返回上一页和返回上一级页面并刷新
JavaScript返回上一页和刷新当前页 window.history.go(-1); //返回上一页 window.history.back(); //返回上一页 //如果要强行刷新的话就是:wi ...
- CentOS下安装docker,docker-compose
1.查看系统发行版本: lsb_release -a 2.安装docker:Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行 ...
- sed:轻量级流编辑器
一. sed命令 sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器.sed主要是用来将数据进行选取.替换.删除.新增的命令 注意:vi命令只能修改文件,但不能修改命令的结果,如 ...
- bzoj2049: [Sdoi2008]Cave 洞穴勘测 lct裸题
题意:三种操作一种摧毁一条边,一种链接一条边,一种查询两个点是否联通 题解:lct的link和cut即可 /********************************************** ...
- HashMap1.8源码分析(红黑树)
转载:https://segmentfault.com/a/1190000012926722?utm_source=tag-newest https://blog.csdn.net/weixin_40 ...
- 【MVC】ASP.NET MVC 4项目模板的结构简介
引言 在VS2012新建一个窗体验证的MVC 4项目后,可以看到微软已经帮我们做了很多了,项目里面该有的都有了,完全可以看成一个简单网站.作为开发,能理解里面文件结构和作用,也算是半只脚踏进M ...
- 浏览器的get请求和post请求的区别
GET 请求和 POST 请求: 1). 使用GET方式传递参数: ①. 在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为 ...
- [leetcode] 101. Symmetric Tree 对称树
题目大意 #!/usr/bin/env python # coding=utf-8 # Date: 2018-08-30 """ https://leetcode.com ...
- 在SSH项目中实现分页效果
在实现分页的时候,我使用的是数据库下面的User表,实现的效果是通过分页查询 能够将表中的数据分页显示,点击相关的按钮实现:首页.上一页.下一页.末页的显示 1新建一个dynamic web proj ...