C++ CPU程序占用率高问题排查

0. 简介

我们在之前介绍了使用Valgrind、perf、AddressSanitzer等工具来完成内存泄漏的检测,当然内存泄漏以外还有cpu的占用率变高这类问题。作者在这里提供几个方法来对C++程序中CPU程序占用率高问题排查。

1. pstack堆栈查看

pstack 命令可以监听日志,Linux 系统默认没有这个命令。所以我们需要安装pstack

sudo apt install pstack

在ubuntu下使用apt安装时,可能会出现无法使用的问题,解决方法是:直接在/usr/bin下新建一个名为pstack的脚本文件,并给sudo权限

#!/bin/shif test $# -ne 1; thenecho "Usage: `basename $0 .sh` <process-id>" 1>&2exit 1
fiif test ! -r /proc/$1; thenecho "Process $1 not found." 1>&2exit 1
fi# GDB doesn't allow "thread apply all bt" when the process isn't
# threaded; need to peek at the process to determine if that or the
# simpler "bt" should be used.backtrace="bt"
if test -d /proc/$1/task ; then# Newer kernel; has a task/ directory.if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; thenbacktrace="thread apply all bt"fi
elif test -f /proc/$1/maps ; then# Older kernel; go by it loading libpthread.if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; thenbacktrace="thread apply all bt"fi
fiGDB=${GDB:-gdb}# Run GDB, strip out unwanted noise.
# --readnever is no longer used since .gdb_index is now in use.
$GDB --quiet -nx $GDBARGS /proc/$1/exe $1 <<EOF 2>&1 |
set width 0
set height 0
set pagination no
$backtrace
EOF
/bin/sed -n \-e 's/^\((gdb) \)*//' \-e '/^#/p' \-e '/^Thread/p'

启动:

 sudo bash /usr/bin/pstack 27596
然后确保pstack命令被以root权限或者适当的权限运行,并确保目标进程处于可调试状态,可以通过使用gdb或者其他调试工具来设置进程的调试。pstack显示的其实是进程在某一刻的调用栈。

以htop为例,这是我们用pstack调用的结果:

这个是用gdb调用的结果:

按照下面的步骤检查一下线程内部的问题

  1. 命令:top -c。 输入大写P,top的输出会按使用cpu多少排序

    PID就是进程号,我程序的进程号是4918。

  2. 查看耗CPU的线程号

     命令:`top -Hp` 进程号。 同样输入大写`P`,`top`的输出会按使用cpu多少排序。输入`top -Hp 4918`,展示内容如图:
    

  可以看出PID是4927的线程占到了100%的cpu,我的业务日志是打印线程号的
  1. 查看耗CPU的任务

    上面找到了耗CPU的线程,那这个线程在做什么呢?

    看线程在干什么,可以看线程的堆栈,命令是pstack 进程号,会输出所有线程的堆栈信息。

    输入pstack 4918,并搜索线程4927的堆栈,展示内容如图:


2. 使用kill功能完成堆栈抓取

除了ptsack以外,还可以使用kill完成高CPU占用时候的数据抓取,相信大家基本使用的是kill -9 + 进程号的方法杀程序。但是我们可以使用kill -s的方法完成更多的功能:

这里是一些常见的kill信号和它们的含义:

  • HUP (1):挂起信号,通常用于通知进程重新加载配置文件。
  • INT (2):中断信号,通常由用户按下Ctrl+C来发送,用于中断进程。
  • QUIT (3):退出信号,通常由用户按下Ctrl+\来发送,用于请求进程退出并生成核心转储文件。
  • ILL (4):非法指令信号,表示进程执行了非法指令。
  • TRAP (5):陷阱信号,通常用于调试目的。
  • ABRT (6):中止信号,通常用于请求进程异常终止并生成核心转储文件。
  • BUS (7):总线错误信号,表示进程执行了非法内存访问。
  • FPE (8):浮点异常信号,表示进程执行了非法的浮点运算。
  • KILL (9):强制终止信号,用于立即终止进程,进程无法捕获或忽略这个信号。
  • USR1 (10):用户自定义信号1,可以由用户自定义处理。
  • USR2 (12):用户自定义信号2,可以由用户自定义处理。
  • PIPE (13):管道破裂信号,表示进程尝试写入已被关闭的管道。
  • ALRM (14):闹钟信号,用于定时器通知。
  • TERM (15):终止信号,通常用于请求进程正常终止。
  • CONT (18):继续信号,用于恢复已停止的进程。
  • STOP (19):停止信号,用于暂停进程的执行。
  • TSTP (20):终端停止信号,通常由用户按下Ctrl+Z来发送,用于请求进程暂停。
  • TTIN (21):后台进程尝试读取终端信号。
  • TTOU (22):后台进程尝试写入终端信号。
  • URG (23):紧急条件信号。
  • XCPU (24):CPU时间限制信号。
  • XFSZ (25):文件大小限制信号。
  • VTALRM (26):虚拟定时器信号。
  • PROF (27):性能计数器定时器信号。
  • WINCH (28):窗口大小改变信号。
  • POLL (29):轮询文件描述符事件信号。
  • PWR (30):电源故障信号。
  • SYS (31):保留供系统使用的信号。
  • RTMIN (34):实时信号的最小值。
  • RTMAX (64):实时信号的最大值。

## …详情请参照[古月居](https://www.guyuehome.com/45663)

3. htop完成堆栈追踪

htop非linux系统的自带工具,需要用户自行安装

sudo apt install htop

htop的界面与top很类似,但功能更强,一大特色是支持鼠标和滚轮操作:

\

此外还可以切换到大写,并使用P来完成CPU利用率排序,使用F完成该进程在界面中高亮显示

使用sudo运行htop,还可以输入s完成strace命令追踪进程的系统调用情况

其他常用指令

  • / 或 F3 : 搜索一个进程
  • \ 或 F4 : 模糊搜索,过滤器
  • F5 :树状显示
  • F7 :减小nice,增加优先级
  • F8 :增大nice,减少优先级
  • F9 :杀死进程

4. 使用strace完成堆栈动态追踪

首先也是安装strace

 sudo apt-get install strace

strace是一个用来动态追踪进程处理的的系统调用和信号的命令。输入下面指令就可以获取信息

sudo strace -p 29844

高级操作可以参考这篇文章:https://cloud.tencent.com/developer/article/1667055

5. 参考连接

https://blog.csdn.net/lmb1612977696/article/details/89404019

https://cloud.tencent.com/developer/article/1667055

http://www.wangkaixuan.tech/?p=943

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

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

相关文章

Macos多协议远程管理---Termius中文

Termius是一款跨平台的终端管理工具&#xff0c;支持Windows、macOS、Linux、iOS和Android等多个操作系统。它提供了一个友好的用户界面和强大的功能&#xff0c;使用户能够远程连接和管理服务器。Termius的基本功能包括终端连接、SSH隧道、文件传输、组织和标记、快捷方式和别…

国企和互联网怎么选?

2023年马上就要结束了&#xff0c;天气还是很冷&#xff0c;大家今年的总结做了吗&#xff1f; 正好这两天看到另外一个我关注的博主更新了一个自己的年终总结。其中有一些话令人印象深刻。 未来对我来说&#xff0c;毫无吸引力。原因很简单&#xff0c;当下已经足够令人清醒、…

万字长文谈自动驾驶bev感知(一)

文章目录 prologuepaper listcamera bev :1. Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D2. M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Birds-Eye View Representation3. BEVDet: High-Pe…

大数据实践之路 读后感

欢迎关注公众号&#xff1a;数据运营入表资产化服务&#xff0c;获取更多算法源码材料 2023数据资源入表白皮书&#xff0c;推荐系统源码下载-CSDN博客 浅析研发支出费用化和资本化的区别-CSDN博客 商业银行数据资产估值白皮书&#xff0c;推荐系统源码下载-CSDN博客 用友B…

Qt编写的exe程序上添加程序信息

1、qtcreator编写 在pro文件中添加如下信息 # 版本信息 VERSION 4.0.2.666# 图标 RC_ICONS Images/MyApp.ico# 公司名称 QMAKE_TARGET_COMPANY "Digia"# 产品名称 QMAKE_TARGET_PRODUCT "Qt Creator"# 文件说明 QMAKE_TARGET_DESCRIPTION "Qt …

【AI】文本转语音 变声 音色克隆 数字人音视频口型同步AI应用

文本转语音 项目地址&#xff1a;https://github.com/coqui-ai/TTS 环境安装&#xff1a; 下载项目&#xff1b;安装Python&#xff0c;安装项目依赖&#xff1a; pip install TTS 1. 下载安装AI模型&#xff1a; https://github.com/facebookresearch/fairseq/tree/main…

外汇平台:投资者惨遇黑平台KYOLO MARKETS,血本无归!

投资外汇盈利了真的需要缴纳税金么&#xff1f;一直以来这个问题成为了众多交易新手的疑问&#xff0c;但对于很多资深外汇投资者来说&#xff0c;这种问题太简单了以至于认为不值一提。但若是从每年发生的外汇诈骗案件来看&#xff0c;可以看到还是有很多新手不知道这个问题&a…

【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)

就是看到了好些教程有些繁琐&#xff0c;我就写了一个 我这个解压安装的交叉编译环境是Linaro GCC的一个版本&#xff0c;可以用于在x86_64的主机上编译arm-linux-gnueabihf的目标代码 步骤来了 在你的Ubuntu系统中创建一个目录&#xff0c;例如/usr/local/arm&#xff0c;然后…

CISP培训强化研发团队,确保金融科技发展安全无忧

​某金融科技公司是行业领先的平台服务商&#xff0c;凭借其在区块链、物联网、云计算、大数据和人工智能等尖端技术的卓越研发实力&#xff0c;致力于将前沿技术融入金融业务模式和应用场景。公司不断努力为客户提供一个“科技金融行业客户”的综合服务平台&#xff0c;从而实…

WebGL技术的应用场景

WebGL&#xff08;Web Graphics Library&#xff09;是一种在Web浏览器中渲染3D图形的技术&#xff0c;它基于OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09;标准&#xff0c;允许通过JavaScript编写高性能的3D图形应用。以下是一些WebGL技术的应用场景&#x…

基于springboot+vue协同过滤算法的电影推荐系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;摘 要 “互联网”的战略实施后&a…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言&#xff0c;最重要的语句 4.使用频率最高的语句 语法&#xff1a; SELECT 字段1&#xff0c;字段2&#xff0c;……FROM 表 有时候…

关于Unity使用图片字体示例

1.使用TexturePacker打包图集 下载地址 TexturePacker - Create Sprite Sheets for your game! 2.准备好数字图 3. 导入图片 4. 打包图集需要的设置 将重心点设置为左下方 点击回车 > 后点击回 >到精灵列表 选择导出的格式 导出后的内容 >导入unity 导入 >…

4.Python数据序列

Python数据序列 一、作业回顾 1、面试题 有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何? 白话文:有一个数字,不知道具体是多少,用3去除剩2,用5去除剩3,用7去除剩2个,问这个数是多少?1 ~ 100以内的整数 while循环: # 初始化计数器 i = …

idea 如何快速拉取新分支

方式1 &#xff08;快捷键&#xff1a;CtrlShift~&#xff09; 方式2:&#xff08;快捷键&#xff1a;Alt9&#xff09;

9_js_dom编程进阶3

Dom节点删除和复制操作事件加强讲解 1. 节点操作 1.1 删除节点 Node.removeChild() 方法从 DOM 中删除一个子节点。返回删除的节点。 child 是要移除的那个子节点。 node 是child的父节点。 PS&#xff1a;只能由父节点删除子节点 课堂案例&#xff1a;1.节点操作之删除节…

【经验分享】日常开发中的故障排查经验分享(一)

目录 简介CPU飙高问题1、使用JVM命令排查CPU飙升100%问题2、使用Arthas的方式定位CPU飙升问题3、Java项目导致CPU飙升的原因有哪些&#xff1f;如何解决&#xff1f; OOM问题&#xff08;内存溢出&#xff09;1、如何定位OOM问题&#xff1f;2、OOM问题产生原因 死锁问题的定位…

polar CTF上传

WEB-上传 一、查看题目信息 二、漏洞分析 经过上传测试发现&#xff0c;这题过滤掉了<?&#xff0c;这样正常的一句话木马就没法上传&#xff0c;这里可以用utf-16编码绕过。因为utf-16占utf-8的两倍长度&#xff0c;上传时默认检测为utf-8,从而就能绕过检测成功上传。 同…

爬虫学习(1)--requests模块的使用

前言 什么是爬虫 爬虫是一种自动化工具&#xff0c;用于从互联网或其他计算机网络上获取数据。它可以模拟人的行为&#xff0c;自动访问网页&#xff0c;提取感兴趣的数据&#xff0c;并将其存储到本地计算机或数据库中。爬虫通常用于搜索引擎、数据分析、信息聚合等领域&…

Linux自定义shell编写

Linux自定义shell编写 一.最终版本展示1.动图展示2.代码展示 二.具体步骤1.打印提示符2.解析命令行3.分析是否是内建命令1.shell对于内建名令的处理2.cd命令3.cd函数的实现4.echo命令的实现5.export命令的实现6.内建命令函数的实现 4.创建子进程通过程序替换执行命令5.循环往复…