最近在做一些性能测试的事情,首要前提是控制住 CPU 的使用量。最直观的方法无疑是安装 Docker,在每个配置了参数的容器里运行基准程序。

对于计算密集型任务,在只限制 CPU 的需求下,直接用 Linux 原生的 cgroup 功能来限制 CPU 使用无疑是最方便的。

本文简要说明如何使用 cgroup 的 cpuset 控制器限制进程只使用某几个 CPU,更准确的说是某个几个逻辑核。

1. 查看 CPU 配置

常用的配置可以用如下 BASH 命令查看。

特别地,启用了超线程的话,每个 CPU 物理核心会模拟出 2 个线程,也叫逻辑核。判断方式如下:

2. 什么是 NUMA

这里提到一个概念叫 NUMA,主机板上如果插有多块 CPU 的话,那么就是 NUMA 架构。每块 CPU 独占一块面积,一般都有独立风扇。

一个 NUMA 节点包含了直连在该区域的 CPU、内存等硬件设备,通信总线一般是 PCI-E。由此也引入了 CPU 亲和性的概念,即 CPU 访问同一个 NUMA 节点上的内存的速度大于访问另一个节点的。

执行以下命令,以查看本机的 NUMA 结构。

一个 NUMA 节点包括一个内存节点和属于同一块 CPU 的若干个逻辑核,请记住它们的编号,将在配置 cpuset 中用到。

在此解释下“node distance”,访问本节点的内存的通信成本是常量值 10,操作系统以此基准来量化访问其他 NUMA 节点上内存的代价。

3. 创建 cgroup 并配置资源使用

内核版本较高(>=2.6.24)的 Linux 发行版都内置了 cgroup,可以执行以下命令验证一下。

mount | grep cgroup
# tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
# cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
# cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
# cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
# cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
# cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
# cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
# cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
# cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
# cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
# cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

如果没有的话,也可以执行一段简单的脚本呢,来一次性挂载齐全。

cgroot="${1:-/sys/fs/cgroup}"
subsys="${2:-blkio cpu cpuacct cpuset devices freezer memory net_cls net_prio ns perf_event}"
mount -t tmpfs cgroup_root "${cgroot}"
for ss in $subsys; domkdir -p "$cgroot/$ss"mount -t cgroup -o "$ss" "$ss" "$cgroot/$ss"
done

cgroup 针对每一种资源都提供了相应的控制器来进行配置,在 Linux 中以文件系统的形式呈现。本文只涉及进程在物理核上的放置,因此来看一下 cpuset 目录下有什么。

mkdir /sys/fs/cgroup/cpuset/tiger # 创建一个控制组,删除用 rmdir 命令
ls /sys/fs/cgroup/cpuset/tiger
# cgroup.clone_children  cpuset.memory_pressure
# cgroup.procs           cpuset.memory_spread_page
# cpuset.cpu_exclusive   cpuset.memory_spread_slab
# cpuset.cpus            cpuset.mems
# cpuset.effective_cpus  cpuset.sched_load_balance
# cpuset.effective_mems  cpuset.sched_relax_domain_level
# cpuset.mem_exclusive   notify_on_release
# cpuset.mem_hardwall    tasks

如果要使用 cpuset 控制器,需要同时配置 cpuset.cpus 和 cpuset.mems 两个文件(参数)。这两个文件接受用短横线和逗号表示的区间,如“0-7,16-23”。如果对应的资源不存在,那么写入的时候会报错。

不建议直接在控制器的根目录下配置,通过创建子目录的形式可以同时维持多个控制器。执行如下命令,限制 tiger 控制组下所有进程只能使用逻辑核0和1。

echo "0-1" > /sys/fs/cgroup/cpuset/tiger/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/tiger/cpuset.mems

对于 cpuset.mems 参数而言,每个内存节点和 NUMA 节点一一对应。如果进程的内存需求量较大,可以把所有的 NUMA 节点都配置进去。这里就用到了 NUMA 的概念。出于性能的考虑,配置的逻辑核和内存节点一般属于同一个 NUMA 节点,可用“numactl --hardware”命令获知它们的映射关系。

4. 验证效果

在 cpuset 的所有配置文件中,tasks 和 cgroups.procs 是用来管理控制组中的进程的。执行以下命令,把当前会话加入刚刚创建的控制组里,本会话发起的所有命令(子进程)都会收到 cpu 使用的约束。

echo $$ > /sys/fs/cgroup/cpuset/tiger/cgroup.procs # 写入当前进程编号

两个配置项基本是等价的,但有一小点不同。操作系统以线程为调度单位,将一个一般的 pid 写入到 tasks 中,只有这个 pid 对应的线程,以及由它产生的其他进程、线程会属于这个控制组。而把 pid 写入 cgroups.procs,操作系统则会把找到其所属进程的所有线程,把它们统统加入到当前控制组。

进程在加入一个控制组后,控制组所对应的限制会即时生效。启动一个计算密集型的任务,申请用 4 个逻辑核。

stress -c 4 &
# [1] 2958521
# stress: info: [2958521] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

观察 CPU 的使用情况来验证效果,只有编号为 0 和 1 的两个逻辑核在工作,用户态的比例高达 100%。

top # 在列表页按数字 1 键,切换到 CPU 看板
# Tasks: 706 total,   3 running, 702 sleeping,   0 stopped,   1 zombie
# %Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# %Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# %Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# %Cpu3  :  0.0 us,  1.7 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

本文系转载,作者:玉龙gg

来源(点击阅读原文可直达):

https://www.cnblogs.com/shishaochen/p/9735114.html

(END)

Linux阅码场原创精华文章汇总

更多精彩,尽在"Linux阅码场",扫描下方二维码关注

别忘了点一下“在看”哦~

利用 cgroup 的 cpuset 控制器限制进程的 CPU 使用相关推荐

  1. 利用Linux的/proc/stat获取指定进程的cpu占有率及内存

    利用Linux的 /proc/stat计算进程的cpu占有率和内存 计算的是进程多个cpu的平均占有率,并不是每个cpu的,所以和top命令中的不一样 getinfo.cpp 1 #include&l ...

  2. taskset 查询或设置进程绑定CPU(亲和性)

    前言 taskset命令用于设置进程(或 线程)的处理器亲和性(Processor Affinity),可以将进程(或 线程)绑定到特定的一个 或 多个CPU上去执行,而不允许将进程(或 线程)调度到 ...

  3. docker容器cpu高问题排查_干货详解:一文教你如何利用阿里开源工具,排查线上CPU居高问题...

    前言 在我们开发过程中,无法避免的会出现所谓的垃圾代码,导致服务器的CPU一直处于100%.但我们应用已经上线,导致服务器CPU居高,但又不知道哪边出现的问题,我们应该怎么去找出哪边的代码出现问题呢? ...

  4. 【Linux】限制进程的CPU使用率

    目录 限制进程CPU使用率 限制进程资源的工具 限制进程CPU使用率 工具  cpulimit 安装 1. cpulimit安装 1.1 Ubuntu/Debian: # apt-get instal ...

  5. 优化命令之vmstat——监控虚拟内存、进程、cpu

    目录 一:vmstat概述 1.1物理内存和虚拟内存 1.2虚拟内存原理 二:vmstat命令 2.1vmstat格式 2.2vmstat参数 三:案例 3.1显示虚拟内存使用情况 3.2一秒内显示2 ...

  6. 服务器(Linux)挖矿木马病毒(kswapd0进程使cpu爆满)

    服务器(Linux)挖矿木马病毒(kswapd0进程使cpu爆满) 前言:由于本人的阿里云服务器遭受攻击,被挖矿,导致CUP爆满,同时受到阿里云官方的邮箱.短信以及电话通知(监管部门是不允许服务器被直 ...

  7. 生产环境下JAVA进程高CPU占用故障排查

    感谢原作者 http://blog.chinaunix.net/uid-10449864-id-3463151.html 问题描述: 生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常 ...

  8. c# 获取所有的进程的cpu使用率_Linux CPU使用率很高,但为啥却找不到高CPU的进程

    案例分析 你的准备 今天依旧探究系统CPU使⽤率⾼的情况,所以这次实验的准备⼯作,与上节课的准备⼯作基本相同,差别在于案例所⽤的Docker 镜像不同. 本次还是基于 Ubuntu 18.04,同样适 ...

  9. 解决linux 系统中Mysql 进程占用CPU 300%故障

    今日接到同事的电话,说微信公共帐号中的游戏无法登陆,用户不能玩了,麻烦尽快解决. 1.登陆IDC机房查看服务器流量图,流量正常,排除故障与流量无关. 2.登陆微信公共帐号中的游戏所在服务器发现系统互载 ...

最新文章

  1. leetcoder reverse polish notation解题笔记
  2. mysql syncbinlog_Mysql之sync-binlog参数
  3. redis:RDM连接阿里云redis服务器
  4. TF-IDF算法讲解
  5. centos安装Ambari
  6. boost::mp11::mp_copy_if相关用法的测试程序
  7. JDK10的新特性:var和匿名类
  8. Java布尔类toString()方法及示例
  9. MySQL中修改表结构的关键字_下列SQL语句中,修改表结构的关键字是
  10. Qt文档阅读笔记-Q_INVOKABLE官方解析及Qt中反射的使用
  11. URI Is Not Registered
  12. linux入门_Linux入门的10种方法
  13. 天然气压缩因子计算软件_徐秀芬等:天然气加气站压缩机组效率的计算方法
  14. go语言:200行代码做udp rtp转发并发分布服务器
  15. C#中“使用”的用途是什么
  16. C语言一个简单的贪吃蛇程序
  17. Go开发关键技术指南
  18. 堪比端游 欧美十大RPG网页游戏推荐
  19. 质量管理的五大问题和对策|优思学院
  20. 直播短视频带货完美运营APP源码 购物直播交友系统源码

热门文章

  1. 在中国,40岁程序员是如何工作的?
  2. [微机原理]多点模拟量计算机数据采集实验
  3. 1.17 ............
  4. php5.3 register_globals,在PHP 5.3中PHP寄存器全局支持?(PHP register globals support in PHP 5.3?)...
  5. Maven的爱恨情仇
  6. 计算机教师使用计划书,信息技术教师个人发展计划
  7. JAVA判断时间是否过期
  8. 如何在网页上添加支付宝链接
  9. 常规正则表达式练习,一起来开心的掉发吧
  10. 安装MySQL报错:[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defau