Linux环境下程序的多核CPU占用率高的问题分析和解决
1.项目问题
前端PDC双目倾斜相机客流统计项目中排查平台服务程序延时大的问题时,平台demo程序测试发现多核cpu中的某个核的占用率达到100%,导致组件中的目标检测线程和客流统计线程的单帧耗时达不到实时,存在延时和丢帧的问题。通过使用strace、pstack进行程序分析,最终找到导致单核占用率很高的原因和解决方法。本文详细描述了该问题的排查过程,并对排查流程做了相关总结。
2.背景技术及术语解释
在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。
3.方案详细描述
1)CPU占用率概念,以及top命令和tegrastats命令的使用
在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。top命令经常用来监控linux的系统状况,比如cpu、内存的使用,显示各进程(任务)的状态监控。
如图1所示。
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。
D = 不可中断的睡眠状态
R = 运行
S = 睡眠
T = 跟踪/停止
Z = 僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)示各个进程(任务)
./tegrastats命令经常用来监控linux的系统显存使用情况,也包含cpu、内存的使用状态,对设备的状态进行监控和显示。如图2所示。
RAM — 内存占用
SWAP — 交换区
cache — 缓存
cpu — cpu各个核心的资源占用
EMC — 内存频率
AVP — 音频资源
VDE — 视频资源
GR3D — GPU消耗
2)CPU占用率过高的问题现象和排查过程
前端PDC双目倾斜相机客流统计项目中排查平台服务程序延时大的问题时,平台demo程序测试发现多核cpu中的某个核的占用率达到100%,导致组件中的目标检测线程和客流统计线程的单帧耗时达不到实时,存在延时和丢帧的问题。Top和tegrastats命令执行,得到的状态如下图3所示。
图3 cpu占用率高的top和tegrastats命令的显示状态
因为这是个多线程的进程,实际上占用cpu的最小单位是线程,所以肯定是众线程中的某一个或几个占用CPU过 高 导 致 的 。 用 下 面 的 命 令 将cpu占 用 率 高 的 线 程 找 出 来:ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
直接使用ps Hh-eo pid,tid,pcpu | sort-nk3 |tail 获取对于的进程号和线程号,如下图4所示。
如上图所示我们可以看出id为17758的线程cpu占用率最高。运行strace命令,可以看到每个线程的
调用堆栈。如下图6所示。
图6strace命令各个线程的堆栈状态
执行pstack脚本,看该线程的调用堆栈,很容易看出在哪一步逻辑上导致了busy loop。如下图7所示。
图7pstack脚本找出导致busyloop的代码行
根据提示,找到对应的代码行,消除busy loop代码,解决cpu占用率高的问题。
3)避免CPU高占用率的方法
通过以上分析,平台demo程序中的main函数中的死循环占用了大量的cpu资源,导致多核cpu中的某个核的占用率达到100%。通过修改demo程序,去掉busy loop,可以避免单核占用率达到100%的问题。同时针对多核cpu中存在0核或者其他核的占用率高的问题,将多个线程处理过程绑定到不同的cpu上,使得多核cpu负载均匀,降低线程处理的耗时。绑核前后的0核cpu占用率见下图8所示。
图8绑核前后的0核cpu占用率
4)正确的线程绑核
Cpu绑核时,应将子线程绑定到不同的cpu核,是cpu的各个核负载均衡。如果将主线程绑核,会导致子线程的绑核不生效。如下图所示。
图9主线程不绑核cpu占用率
图10主线程绑0核cpu占用率
图11主线程绑1核cpu占用率线程的cpu
绑核是通过设置线程的调度亲缘性来实现的。因为Linux操作系统下进程和线程的创建都是通过系统调用clone来实现的,所以实际上调度亲缘性也是被用pthread_create创建的线程所继承的。这意味着,如果主线程在创建其它线程之前设定亲缘性,那么它所设定的亲缘性将被继承,因为这时所有线程的亲缘性相同。
总结:
(1)程序中的高CPU占用率问题,可以通过strace工具和pstack脚本进行定位;
(2)CPU的高占用率可以通过消除代码中的busyloop和线程绑核的方式避免或使多核CPU负载均匀;
(3)多核CPU绑定时,应避免将主线程进行绑核,将处理子线程分别绑定至不同的CPU核,可以实现CPU负载均匀,提高运行效率;
Linux环境下程序的多核CPU占用率高的问题分析和解决相关推荐
- tomcat服务器cpu占用率居高不下的原因分析及解决
tomcat服务器cpu占用率居高不下的原因分析及解决 偶遇服务器cpu飙升,过段时间后正常,反反复复 获取cpu占用高的java进程运行中的堆栈信息 偶遇服务器cpu飙升,过段时间后正常,反反复复 ...
- 一次服务器CPU占用率高的定位分析
背景 通过性能监控发现上线服务器cpu某核占用率已经达到了100%,而且是由我们的某个核心服务导致的.幸亏由于我们的服务进程由多个相同worker(线程)调度承担的,所以除了CPU占用率高之外,并没有 ...
- 关于android 进程CPU占用率高的原因分析
*记录开发中的问题,方便以后自已回忆,2017-07-17 记录 在开发一个语音的线程中,发现有如下事情,系统越来越慢,也越来越卡,打到 adb shell 输 入 top 查看系统资源,发现 CPU ...
- 原创|面试官:线上服务器CPU占用率高如何排查定位问题?
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...
- 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...
面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...
- 线上服务器CPU占用率高如何排查定位问题?
(关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...
- 让多核CPU占用率曲线听你指挥(Windows实现)——《编程之美》1.1学习笔记
让多核CPU占用率曲线听你指挥--<编程之美>1.1学习笔记 Problem: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.有以下几种情况: ...
- linux rsyslogd cpu占用率高问题
最近有几次,linux centos 7 服务停了后,重启,再起一些应用后,查看top后,rsyslogd cpu占用率高问题, 先说我这块怀疑导致的原因吧. 原因 很有可能是当前机器的系统盘挂载出现 ...
- 电脑游戏显卡cpu占用率测试软件,游戏运行慢CPU占用率高试下更换显卡驱动试试...
我们平常在玩一些大型的游戏的时候,经常会遇到运行游戏软件时候电脑速度慢,电脑显示CPU占用率已经达到了100%的情况.其实遇到这类的问题是很正常的,因为我们在玩大型的游戏时需要占用到较多的CPU资源. ...
最新文章
- Http请求之优雅的RestTemplate
- Apache commons-io
- 【面试题视频讲解】TreeSet使用示例
- C/C++——C风格的字符串的指针指向的内存位置问题(易错)
- 行为设计模式 - 解释器设计模式
- poj1236/luogu2746 Network of Schools (tarjan)
- 初识EntityFramework6【转】
- 有趣的算法(七):3分钟看懂希尔排序(C语言实现)
- tushare找出箱体突破点
- hdoj1299 还是A+B
- java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition
- 完美解决vmware连接摄像头问题(驱动程序错误)
- Eagle设计师必备利器管理工具
- 我用飞桨Parakeet合成小姐姐声音帮我“读”论文
- python 斗破苍穹 词云
- 【系统分析与验证笔记】Transition System模型知识点
- List size为1但是内容为null处理方法
- 研究报告 | 珠光宝气加持,谁能抓住“促消费”的东风?
- 翻译: 4.多层感知器 pytorch
- Webug4.0-webshell爆破 ssrf
热门文章
- JavaScript中的new操作符的原理解析
- xlsx 导出 多级表头数据
- 中级软件设计师考试错题及知识点整理
- 如何安装和使用 Windows XP 的故障恢复控制台
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛E题小Y吃苹果
- 利用python爬虫技术获取每天每场的每位球员NBA数据以及每日范特西评分
- Android 解压zip压缩包 (压缩包内有多级目录)
- uniapp:去掉微信小程序顶部的导航栏
- 一个游戏制作的全过程
- Springboot毕设项目海尔空调售后服务系统d70j3java+VUE+Mybatis+Maven+Mysql+sprnig)