Linux性能监测工具-01-系统级
1.top
top是众多linux/unix系统自带的监测工具。
top能提供系统总体,以及分进程的CPU、内存使用信息。
常用命令如下:
a) 1 – 分核心查看CPU利用率
top命令默认展示的是各CPU内核使用率的平均值(我们其实启动了一个能占满一个核心的程序,从平均值来看占用率只有25%左右):
在界面键入1可展示分核心的使用率信息(这时就能看到那个占满一个核心的程序了):
b) 2 – 分NUMA节点查看CPU利用率
这是我的桌面电脑,只有一个NUMA节点:
这是我们的服务器,有两个NUMA节点:
c) M – 将进程按照内存占用率从大到小排列
这是我的博客网站的主机,可以看到内存使用最大的是mysql的进程:
d) P – 将进程按照CPU利用率从大到小排列
这是我的桌面电脑,我启动了一个测试程序,可以占满CPU,这里可以轻易找到它:
2.htop
htop非linux系统的自带工具,需要用户自行安装。
ubuntu使用sudo apt install htop命令安装即可,redhat用户需要下载源码(链接在此)手动安装。
htop的界面与top很类似,但功能更强,一大特色是支持鼠标和滚轮操作:
比如在top界面中我们需要输入P来使得进程列表按照CPU利用率排列,这里我们我们直接用鼠标点击列头即可(当然输入P的方式也是可以使用的)。
常用操作如下:
a) F- 追踪显示
(鼠标或键盘)选中某进程后,按F可使得该进程在界面中高亮显示。这样的话,进程即使在列表中跳来跳去,我们也能快速定位:
b) s -用strace命令追踪进程的系统调用情况
要使用该功能,htop需要sudo运行,比如我们追踪下htop本身的系统调情况:
c) 其他常用命令
- / 或 F3 : 搜索一个进程
- \ 或 F4 : 模糊搜索,过滤器
- F5 :树状显示
- F7 :减小nice,增加优先级
- F8 :增大nice,减少优先级
- F9 :杀死进程
3.pstack
pstack实际上是一个脚本,它调用gdb,attach到进程上,使用bt输出堆栈信息,然后格式化输出。
在redhat下,只需yum安装gdb即可附带安装pstack命令。
在ubuntu下使用apt安装时,可能会出现无法使用的问题,解决方法是:直接在/usr/bin下新建一个名为pstack的脚本文件,添加如下内容即可:
#!/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:-/usr/bin/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'
它显示的其实是进程在某一刻的调用栈。
以htop为例,这是我们用pstack调用的结果:
这个是用gdb调用的结果:
是不是很像。
4.strace
strace是一个用来动态追踪进程处理的的系统调用和信号的命令。Redhat和Ubuntu直接使用yum或apt命令安装即可。
比如下面这个例子:
wake_test进程会周期性地sleep一下,每当它sleep,strace这里就输出一条相关记录,表示wake_test进程调用了底层的clock_nanosleep系统调用。
再如下面这个例子:
我使用上面的命令监控博客系统上的mysql进程,我只要一点击页面(造成访问数据库的场景),strace这里就会输出相关的记录,如上图。
5.perf
perf是一个比较高级的系统级监控命令,相当于pstack和strace的结合后的升级版。
在redhat系统下使用yum安装,在ubuntu下使用apt安装(包名称为linux-tools-common)。
perf功能强大,我常用的命令是perf top -K -p xxx,即将进程在用户空间的调用耗时排序,因此可以用来快速定位系统运行瓶颈。
我在博客主机上使用perf命令监控了一下mysql的行为,结果如下:
即mysql在运行期间,最耗时的操作是解析sql语句(MYSQLparse)。
6.总结
这些系统级的监测工具大都是基于proc文件系统和一些性能寄存器的,总体上属于间接监控,因此难以做到非常精细的监测和分析。
下一篇文章我们将介绍侵入式的性能监测工具,功能更为强大,监测结果更为可靠,但缺点是需要修改源代码。