Linux性能监测工具-01-系统级

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文件系统和一些性能寄存器的,总体上属于间接监控,因此难以做到非常精细的监测和分析。

下一篇文章我们将介绍侵入式的性能监测工具,功能更为强大,监测结果更为可靠,但缺点是需要修改源代码。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注