一次限制进程的 CPU 用量的实操过程

大家好,我是飞哥!

给大家分享一个事情。背景是这样的,我们要测试某个第三方 SDK 运行性能,这是个 CPU 密集型的服务。我想评估一下它运行一遍到底有多吃 CPU,以便评估上线后我们需要部署多少台服务器。

我们是在一台 16 物理核的机器上测试的,我们的想法是把它启动起来,然后执行一遍。用耗时乘以 16 核那就是总的 CPU 耗时开销。不过不巧的是我们发现这个货在并发上做的并不是特别好,运行的前半段里只能打满一个核,而后半段可以把整台机器上所有 16 核都打满。这样就没法准确估算它的 CPU 消耗了。

最先我想到的方案是将这个 SDK 进行 numa 绑定。但是 nuam 绑定只能将 cpu 限制在一个 node 上,我的机器上 一个 node 里有 8 个核。问题仍然存在,还是不能精确控制 cpu 的用量。

所以我接着又想到了 cgroup 。假如我能从始至终都限制这个 SDK 只使用一个核,且把一个核全部打满,这样我就能准确地评估它的 CPU 耗时。

说干就干。Cgroup 这玩意儿听起来复杂,没想到用起来那是超级的简单。首先我找到了 cpu,cpuacct 这个 group。在它下面创建一个子 group,一行 mkdir 就能搞定。

# cd /sys/fs/cgroup/cpu,cpuacct
# mkdir test
# cd test

这时候 cgroup 已经在 test 这个目录下帮我们创建好了一些文件,通过修改这些文件可以控制进程的 CPU 消耗的。

# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 23 11:38 cgroup.procs
-rw-r--r-- 1 root root 0 Sep 23 11:37 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Sep 23 11:37 cpu.cfs_quota_us
......

为了简便,我们只关注上面几个文件。其中 cfs_period_us 用来配置时间周期长度,cfs_quota_us  用来配置当前 cgroup 在设置的周期长度内所能使用的 CPU 时间。这两个文件配合起来就可以设置 CPU 的使用上限。

比如我想控制我的进程最多只能使用 1 个核,那么就这样。

# echo 500000 > cpu.cfs_quota_us // 500ms 
# echo 500000 > cpu.cfs_period_us // 500ms

每 500ms 能使用 500ms的 CPU 时间,即将 cpu 使用限制在 1 个核以内。(如果想要限制只用两个核,那就把 cpu.cfs_quota_us 改成 1000000 即可)

这个时候,还缺关键的一步。把要限制的进程加进来。这个也简单,修改 cgroup.procs 把要限制的进程 pid 添加进去就行了。

这里有个细节,那就是加入一个进程后,这个进程创建的子进程都将默认加到这个 cgroup 的限制中。虽然我们不知道我们将要启动的进程的 pid 是多少,但是我们可以查到当前 bash 进程的 pid,只要把它加进来就行了。这样后面通过控制台启动进程的时候,都将自动进入 cgroup 限制中。

# echo $$
16403
sh -c "echo 16403 > cgroup.procs"

这个时候我们使用一个简单的工具 ,stress。用它来模拟开篇 sdk 的 cpu 密集型工作。通过 -c 指定开启几个进程,然后每个进程都反复不停的计算随机数的平方根,尽最大努力消耗 cpu。

# stress -c 4

另外启动一个控制台,观察 cpu 消耗。发现总量确实是控制住了。stress 及其子进程加起来都只使用了 1 核。

251a3ef08de96e3f041997038140c82c.png

不过我发现了一个不满意的地方。虽然 cpu 用量是控制住了,但是 cpu 消耗是分散在各个 cpu 核上的,而且还是飘来飘去的。我想要的效果是限制它在某一个核上运行。

回来查看了一下 cgroup 目录下的文件。猛然看到了一个叫 cpuset 的 group。第六感告诉我,它一定可以!

# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 2 root root  0 Sep 15 17:43 blkio
lrwxrwxrwx 1 root root 11 Sep 15 17:43 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Sep 15 17:43 cpuacct -> cpu,cpuacct
drwxr-xr-x 4 root root  0 Sep 15 17:43 cpu,cpuacct
drwxr-xr-x 3 root root  0 Sep 15 17:43 cpuset  // 就是它!
......

于是乎,我先是废弃了刚刚的 test 配置,直接删除即可(rm -rf /sys/fs/cgroup/cpu,cpuacct)。再我搜了一下这个 cpuset 怎么用,开始新的配置。

# cd /sys/fs/cgroup/cpuset
# mkdir test && cd test
# echo "0" > cpuset.cpus //限制在第 0 号核上
# echo 0 > cpuset.mems
# echo $$ > cgroup.procs

继续开始施加 cpu 压力。

# stress -c 4

在另外一个控制台上查看效果。

231df79c3bc52c93d6dc9b869a573611.png

eced3e5a5bdfb3971b69b85507ec597e.png

完美!这次不但将 cpu 用量控制在了一个核,而且也将 CPU 消耗牢牢地钉在了 cpu0 上。这就是我想要的效果!

基于这个方法,我们就非常准确地完成了对那个第三方 sdk 的 cpu 消耗用量的测试。也评估出来未来上线后需要几台服务器。

439d3e9d51e54b0e42be8b40a6911284.jpeg

487e6bceeb694f1fa4a1286edd646c48.jpeg

3c8548d6096062bb9ddcf2fca17e3da2.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

map与unordered_map的区别

set/map底层实现的机制是红黑树。红黑树是一种近似于平衡的二叉查找树,默认是按升序排序的。在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。 红黑树的缺点:空间占用率高,每一个节点都需要额外保存父节点、孩子节点和红/黑性质&am…

navicat不同数据库数据传输

复制fo的t_fo_account表结构和数据到base库 结果 转载于:https://www.cnblogs.com/feifeicui/p/10307646.html

收藏了两年的嵌入式AI资源学习笔记,今天全分享给大家(附代码/资料/视频/学习规划)...

当前乃至未来5-10年,嵌入式开发者还有哪些风口?”画外音:风口的本质,其实就是一段时间的人才供需不平衡。说白了就是由于行业突变,敏锐的资本快速进入,导致短时间内行业大量扩张,需要大量开发者…

Vmware由于centos升级内核不可运行(C header files matching your running kernel were not found)的解决方案...

C header files matching your running kernel were not found. Refer to your distributions documentation for installation instructions - NoH4cker - 博客园 http://www.cnblogs.com/NoH4cker/p/4840571.html centos6 安装wmwaretools找不到kernel header - jiejnan - 博…

分享一个消息组件

前段时间在收集项目素材时发现一个很好用的消息组件ymPrompt,顺便收集了圈子里关于这个组件的文章,感觉介绍不是很完善。 废话少说先看一下演示效果: 演示Demo: http://www.ajaxbbs.net/test/ymPrompt4.0/demo.html 截取的图片: Vista样式 简短的实现脚本: Code--导…

用C语言搞机器学习,来个最基础的Knn入门

本来是准备周末加班两天的,然后,临时突然其他事情又取消了。顺便看了下csdn,看到一篇介绍KNN的,因为我现在做的也是属于机器学习方向,那自然也要了解一些这部分。KNN是什么?KNN可以说是最简单的分类算法之一…

最简单的断线断点检测器电路

要在长长的电线中找到究竟是哪里断开了,可以做一个断线断点检测器。而且几个元器件就可以实现,非常简单。这个断线断点检测器不仅可以识别火线、零线,还可以检测电线是哪里断开了。实际是检测哪里的磁场强,哪里的电磁辐射大。来看…

声学发展史之——人工智能(AI)声学

引言最近接手了一个EOL (End of Line)的项目,用高斯混合模型GMM (Gaussian Mixture Model)作生产线上产品的质量检测。虽然提取特征的过程很痛苦,不过还是很有意思。也是因为兴趣,去年在Coursera上了吴恩达的Machine Learning,算是…

一个application多个 URL

需求: 希望一个sharepoint网站,有多个网址去访问。例如:http://moss:8080/的网站,http://aphla.prismshareusa.int/ 和 http://aphla.carat.int/ 两个网站同时访问。 解决方法如下: 1)创建DNS…

写的重采样文章被大佬看到了

他让我看重采样昨天写的重采样文章被一个大佬看到了,给我发了消息如下大佬是个技术原厂Linux方向的负责人,我在工作上遇到的好几次疑难杂症都是在他的指点下得到解决,而且平时讨论技术的时候,能感觉到他对技术问题理解很深。从他的…

根据IP地址获取主机名称

IP地址获得主机名称 1. 根据IP地址获得主机名称///<summary>///根据IP地址获得主机名称 ///</summary>///<param name"ip">主机的IP地址</param>///<returns>主机名称</returns>publicstringGetHostNameByIp(stringip) …

vector中的reserve() 与 resize()

resize()与reserve()都是vector容器中的方法&#xff1a; resize():改变了capacity()和size() reserve():增加了vector的capacity()&#xff0c;但是它的size()没有改变 #include <iostream> #include <stdio.h> #include <vector> #include<functiona…

【C++】考虑virtual函数以外的其他选择

假设你正在写一个视频游戏软件&#xff0c;游戏里有各种各样的人物&#xff0c;每个人物都有健康状态&#xff0c;而且不同的人物可能以不同的方式计算他们的健康指数&#xff0e;该如何设计游戏里的人物&#xff0c;主要如何提供一个返回人物健康指数的接口&#xff0e; 方法一…

不知道你们遇到这样的问题没?

最近在网上看到这样一个内容https://developer.horizon.ai/forumDetail/118363914936419003关于J5/J3/J2平台的底层软件地平线内部的释放计划和形式&#xff1f;您好&#xff1a;问题如题&#xff0c;我们当前在地平线J5平台展开进行的项目居多&#xff0c;跟贵司接触和合作的部…

boost::split()的使用方式

引用的头文件 <boost/algorithm/string.hpp> boost::split()函数用于切割string字符串&#xff0c;将切割之后的字符串放到一个std::vector<std::string> 之中&#xff1b; 有4个参数&#xff1a; 以boost::split(type, select_list, boost::is_any_of(",&…

第四周:机器学习知识点回顾

前言&#xff1a; 讲真&#xff0c;复习这块我是比较头大的&#xff0c;之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的&#xff0c;现在一想脑子里就剩下几个名词就觉得废柴一个了&#xff0c;朋友们有没有同感…

移植linux内核到i.MX6ULL过程

本文描述移植NXP官方 linux 5.4 内核到i.MX6ULL开发板。一、NXP官方linux内核1. 下载 NXP官方linux仓库地址为&#xff1a;https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。选择该分支下载zip包即可&#xff0c;不要整个仓库下载&#xff0c;太大了&#xff1a;2…

Go语言之进阶篇http服务器获取客户端的一些信息

1、http服务器获取客户端的一些信息 示例: package mainimport ("fmt""net/http" )//w, 给客户端回复数据 //r, 读取客户端发送的数据 func HandConn(w http.ResponseWriter, r *http.Request) {fmt.Println("r.Method ", r.Method)fmt.Println…

R学习之——R用于文本挖掘(tm包)

首先需要安装并加载tm包。 1、读取文本 x readLines("222.txt") 2、建立语料库 > rCorpus(VectorSource(x))> rA corpus with 7012 text documents 3、语料库输出&#xff0c;保存到硬盘 > writeCorpus(r) 4、查看语料库 > print(r) A corpus with 7012…

学了STM32要继续学习Linux吗?

关注我的读者中&#xff0c;有很大一部分是单片机&#xff08;STM32&#xff09;的开发者&#xff0c;经常看到有人问类似的问题&#xff1a;学了STM32要继续学习Linux吗&#xff1f;每个人的情况不同&#xff0c;到底要不要学习Linux&#xff0c;要结合自身的情况。有的人已经…