CPU 实用工具

系统版本:CentOS 7.4

top

17:49:04       // 当前时间
up 3:55       // 系统运行时间,格式为时:分
2 users        // 当前登录用户数
load average   // 三个值分别为 1分钟,5分钟,15分钟内的系统负载,当这个值超过 CPU 可执行单元的数目,表示 CPU 的性能已成为瓶颈。

Tasks       // 进程总数
running     // 正在运行的进程数,包括正在 CPU 上运行的和将要被调度运行的
sleeping    // 睡眠的进程数, 通常是等待事件(比如 IO 操作)完成的任务,细分可以包括 interruptible 和 uninterruptible 的类型;
stopped     // 停止的进程数
zombie      // 僵尸进程数

us     // 用户空间占用 CPU 百分比
sy     // 内核空间占用 CPU 百分比,操作系统通过系统调用(system call)从用户态陷入内核态,以执行特定的服务;但是当服务器执行的 IO 比较
          密集的时候,该值会比较大
ni     // 用户进程空间内改变过优先级的进程占用CPU百分比
id     // 空闲CPU百分比
wa     // 等待 IO  输入输出的CPU时间百分比
hi     // 硬中断占用百分比
si     // 软中断占用百分比
st     // 虚拟机占用百分比

PID         // 每个进程的 ID
USER        // 每个进程所有者的用户名
PR          // 每个进程的优先级别
NI          // 该进程的优先级值
VIRT        // 进程需要的虚拟内存大小,包括进程使用的库,代码,数据等
RES         // 该进程占用的物理内存的总数量,单位是 KB
SHR         // 该进程使用共享内存的数量
S           // 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止, Z=僵尸进程)
%CPU        // 该进程自最近一次刷新一来所占用的CPU时间和总时间的百分比
%MEM        // 该进程占用的物理内存占总内存的百分比
TIME+       // 该进程自启动以来所占用的总 CPU 时间。
COMMAND     // 该进程的命令名称。

S 列(也就是 Status 列)表示进程的状态。
R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了 
  区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又 
  会恢复运行。
X 是 Dead 的缩写,表示进程已经消亡,所以你不会在 top 或者 ps 命令中看到它。
s 表示这个进程是一个会话的领导进程,会话是指共享同一个控制终端的一个或多个进程组。
+ 表示前台进程组。进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员

比如,我们通过 SSH 登录服务器,就会打开一个控制终端(TTY),这个控制终端就对应一个会话。而我们在终端中运行的命令以及它们的子进程,就构成了一个个的进程组,其中,在后台运行的命令,构成后台进程组;在前台运行的命令,构成前台进程组。

CPU 占用率高很多情况下意味着一些东西,这也给服务器 CPU 使用率过高情况下指明了相应地排查思路:

当 user 占用率过高的时候,通常是某些个别的进程占用了大量的 CPU,这时候很容易通过 top 找到该程序;此时如果怀疑程序异常,可以通过 perf 等思路找出热点调用函数来进一步排查;

当 system 占用率过高的时候,如果 IO 操作(包括终端 IO)比较多,可能会造成这部分的 CPU 占用率高,比如在 file server、database server 等类型的服务器上,否则(比如>20%)很可能有些部分的内核、驱动模块有问题;

当 nice 占用率过高的时候,通常是有意行为,当进程的发起者知道某些进程占用较高的 CPU,会设置其 nice 值确保不会淹没其他进程对 CPU 的使用请求;

当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成;

当 irq/softirq 占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查 /proc/interrupts 文件来深究问题所在;

当 steal 占用率过高的时候,黑心厂商虚拟机超售了!

uptime

14:01:02         //系统当前时间
up 3 days, 7 min //主机已运行时间
2 users          //当前登录用户数
load average: 0.00, 0.01, 0.05  //三个值分别为 1分钟,5分钟,15分钟内的系统平均负载
注意:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

vmstat

(Procs) r      // 运行队列中进程数量
(Procs) b      // 等待 IO 的进程数量
(Memory) swpd  // 使用虚拟内存大小
(Memory) free  // 可用内存大小
(Memory) buff  // 用作缓冲的内存大小
(Memory) cache // 用作缓存的内存大小
(Swap) si      // 每秒从交换区写到内存的大小
(Swap) so      // 每秒写入交换区的内存大小
(IO) bi        // 每秒读取的块数
(IO) bo        // 每秒写入的块数
(System) in    // 每秒中断数,包括时钟中断
(System) cs    // 每秒上下文切换数
(CPU) us       // 用户进程执行时间 (user time)
(CPU) sy       // 系统进程执行时间 (system time)
(CPU) id       // 空闲时间(包括 IO 等待时间)
(CPU) wa       // 等待IO时间


指令介绍

-a :显示活跃和非活跃内存
-f :显示从系统启动至今的fork数量。
-m :显示slabinfo
-n :只在开始时显示一次各字段名称。
-s∶显示内存相关统计信息及多种系统活动数。
delay :刷新时间间隔。如果不指定,只显示—条结果。
count :刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p∶显示指定磁盘分区统计信息
-S︰使用指定单位显示。参数有k ,K, m,M,分别代表1000,1024,1000000,1048576字节。默认单位为K ( 1024 bytes )
-V :显示vmstat版本信息。

安装 sysstat-12.0.1

yum install gcc gcc-c++ wget -y
wget http://sebastien.godard.pagesperso-orange.fr/sysstat-12.0.1.tar.gz
tar zxvf sysstat-12.0.1.tar.gz
cd sysstat-12.0.1
./configure 
make && make install

mpstat

%user      // 表示处理用户进程所使用CPU的百分比。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
%nice      // 代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
%sys       // 表示内核进程使用的CPU百分比;
%iowait    // 表示等待进行I/O所使用的CPU时间百分比;
%irq       // 代表处理硬中断的 CPU 时间。
%soft      // 表示用于软件中断的CPU百分比;
%idle      // 显示CPU的空闲时间;注意,它不包括等待 I/O 的时间(iowait)
steal      //(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
guest      //(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
guest_nice //(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。

# 显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:41:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:41:33     all    0.21    0.00   12.07   32.67    0.00    0.21    0.00    0.00    0.00   54.84
13:41:33       0    0.43    0.00   23.87   67.53    0.00    0.43    0.00    0.00    0.00    7.74
13:41:33       1    0.00    0.00    0.81    0.20    0.00    0.00    0.00    0.00    0.00   98.99

sar

%user   // 显示在用户级别(application)运行使用CPU总时间的百分比。
%nice   // 代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
%system // 在核心级别(kernel) 运行所使用CPU总时间的百分比。
%iowait // 显示用于等待I/O操作占用CPU总时间的百分比。
%steal  // 管理程序(hypervisor)为另一虚拟进程提供服务而等待虚拟CPU的百分比。
%idle   // 显示CPU空闲时间占用CPU总时间的百分比。

1.若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2.若 %idle 高但是系统响应慢时,可能是CPU等待分配内存,此时应加大内存容量
3.若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

如果要查看二进制文件 test 中的内容,需键入如下sar命令:
sar -u -f test
-u : 输出cpu使用情况和统计信息
-f : 从制定的文件读取报告

pidstat

用法:

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]

常用的参数:
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数

cpu使用情况统计(-u)

PID     // 进程ID
%usr    // 进程在用户空间占用cpu的百分比
%system // 进程在内核空间占用cpu的百分比
%guest  // 进程在虚拟机占用cpu的百分比
%CPU    // 进程占用cpu的百分比
CPU     // 处理进程的cpu编号
Command // 当前进程对应的命令

UID     // 执行进程的 UID
PID     // 进程ID
%usr    // 进程在用户空间占用cpu的百分比
%system // 进程在内核空间占用cpu的百分比
%guest  // 进程在虚拟机占用cpu的百分比
%CPU    // 进程占用cpu的百分比
CPU     // 处理进程的cpu编号
Command // 当前进程对应的命令

显示各个进程的IO使用情况(-d)

PID: 进程id
kB_rd/s: 每秒从磁盘读取的KB
kB_wr/s: 每秒写入磁盘KB
kB_ccwr/s: 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
COMMAND: task的命令名

显示各个进程的上下文切换情况(-w)

# 每隔5秒输出1组数据
$ pidstat -w 5
Linux 4.15.0 (ubuntu)  09/23/18  _x86_64_  (2 CPU)

08:18:26      UID       PID   cswch/s nvcswch/s  Command
08:18:31        0         1      0.20      0.00  systemd
08:18:31        0         8      5.40      0.00  rcu_sched

这个结果中有两列内容是我们的重点关注对象。
一个是  cswch  ,表示每秒自愿上下文切换(voluntary context switches)的次数,
一个是  nvcswch  ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
这两个概念意味着不同的性能问题:
所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。

每秒上下文切换多少次才算正常呢?这个数值其实取决于系统本身的 CPU 性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常的。
但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。这时,你还需要根据上下文切换的类型,再做具体分析。
比方说:
1. 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
2. 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
3. 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

execsnoop

一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。

# 下载
cd /usr/local/sbin/
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/execsnoop
chmod 755 execsnoop 

# 运行 
execsnoop 
posted @ 2018-11-27 10:07  klvchen  阅读(572)  评论(0编辑  收藏  举报