我们在之前介绍了使用Valgrind、perf、AddressSanitzer等工具来完成内存泄漏的检测,当然内存泄漏以外还有cpu的占用率变高这类问题。作者在这里提供几个方法来对C++程序中CPU程序占用率高问题排查。
pstack 命令可以监听日志,Linux 系统默认没有这个命令。所以我们需要安装pstack
sudo apt install pstack
在ubuntu下使用apt安装时,可能会出现无法使用的问题,解决方法是:直接在/usr/bin下新建一个名为pstack的脚本文件,并给sudo权限
#!/bin/sh
if test $# -ne 1; then
echo "Usage: `basename $0 .sh` <process-id>" 1>&2
exit 1
fi
if test ! -r /proc/$1; then
echo "Process $1 not found." 1>&2
exit 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 ; then
backtrace="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 ; then
backtrace="thread apply all bt"
fi
fi
GDB=${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
以htop为例,这是我们用pstack调用的结果:
这个是用gdb调用的结果:
按照下面的步骤检查一下线程内部的问题
命令:top -c
。 输入大写P,top的输出会按使用cpu多少排序
PID就是进程号,我程序的进程号是4918。
查看耗CPU的线程号
命令:`top -Hp` 进程号。 同样输入大写`P`,`top`的输出会按使用cpu多少排序。
输入`top -Hp 4918`,展示内容如图:
可以看出PID是4927的线程占到了100%的cpu,我的业务日志是打印线程号的
查看耗CPU的任务
上面找到了耗CPU的线程,那这个线程在做什么呢?
看线程在干什么,可以看线程的堆栈,命令是pstack 进程号,会输出所有线程的堆栈信息。
输入pstack 4918
,并搜索线程4927的堆栈,展示内容如图:
除了ptsack以外,还可以使用kill完成高CPU占用时候的数据抓取,相信大家基本使用的是kill -9 + 进程号的方法杀程序。但是我们可以使用kill -s的方法完成更多的功能:
这里是一些常见的kill信号和它们的含义:
htop非linux系统的自带工具,需要用户自行安装
sudo apt install htop
htop的界面与top很类似,但功能更强,一大特色是支持鼠标和滚轮操作:
\
此外还可以切换到大写,并使用P来完成CPU利用率排序,使用F完成该进程在界面中高亮显示
使用sudo运行htop,还可以输入s完成strace命令追踪进程的系统调用情况
首先也是安装strace
sudo apt-get install strace
strace是一个用来动态追踪进程处理的的系统调用和信号的命令。输入下面指令就可以获取信息
sudo strace -p 29844
高级操作可以参考这篇文章:https://cloud.tencent.com/developer/article/1667055
https://blog.csdn.net/lmb1612977696/article/details/89404019