首页 > 代码库 > [转载] Linux常用性能分析命令(一)

[转载] Linux常用性能分析命令(一)

在使用Linux服务器的过程中,16个命令可以帮助我们更好的了解服务器的运行状况,做到及时发现,及时处理。排名不分先后,一一道来


 1. 性能分析之 iostat 命令使用


 iostat命令显示的是你的存储系统的细节状态。iostat显示系统三种类型的报告:CPU利用率、设备使用报告和网络文件系统报告等是否正常,完全可以在用户抱怨服务器慢之前,通过这个命令发现系统I/O方面的问题。

不添加任何选项执行iostat命令,执行结果如下:

$ iostat
Linux 2.6.32-504.el6.x86_64 (hostname)      08/06/2017      _x86_64_        (16 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          17.66    0.00    0.29    0.01    0.00   82.04

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.61         0.57        12.23   19046912  408492024
dm-0              0.06         0.12         0.35    4102616   11635208
dm-1              1.50         0.45        11.88   14930226  396856672
up-0              2.29        22.92        66.40  765535386 2217711216。。。。。。

单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统内核版本、主机名、日期、系统位数和逻辑CPU个数的一行外,另有两部分:
avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值
Device: 各磁盘设备的IO统计信息

对于cpu统计信息一行,我们主要看iowait的值,它指示cpu用于等待io请求完成的时间。

Device中各列含义如下:
Device: 以sdX形式显示的设备名称
tps: 每秒进程下发的IO读、写请求数量
Blk_read/s: 每秒读扇区数量(一扇区为512bytes)
Blk_wrtn/s: 每秒写扇区数量
Blk_read: 取样时间间隔内读扇区总数量
Blk_wrtn: 取样时间间隔内写扇区总数量
我们可以使用-c选项单独显示avg-cpu部分的结果,使用-d选项单独显示Device部分的信息。

iostat常见用法:

iostat -d -k 1 10         #查看TPS和吞吐量信息(磁盘读写速度单位为KB)
iostat -d -m 2            #查看TPS和吞吐量信息(磁盘读写速度单位为MB)
iostat -d -x -k 1 10      #查看设备使用率(%util)、响应时间(await
iostat -c 1 10 #查看cpu状态

2.  性能分析之 top 命令使用


 top命令可以显示系统中的进程信息。默认情况下,top会按照CPU使用率从高到低来显示系统中的进程,并且每5秒刷新一次排行榜。当然,你也可以让top按照PID、进程寿命、CPU耗时、内存消耗等维度对进程进行排序。(可以使用P和M快捷键,分别是按CPU利用率排序、按内存使用量排序)通过top命令,你可以很快的发现那些失去控制或不符合预期的进程。

top - 00:33:50 up 386 days, 14:03, 1 user, load average: 0.00, 0.04, 0.01
Tasks: 425 total, 1 running, 424 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 264552000k total, 197559072k used, 66992928k free, 324000k buffers
Swap: 134217724k total, 25448k used, 134192276k free, 190391340k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
2184 oracle -2 0 125g 16m 14m S 1.3 0.0 8:26.37 oracle 
2194 oracle 20 0 125g 111m 94m S 0.7 0.0 6:09.90 oracle 
2212 oracle 20 0 125g 134m 131m S 0.3 0.1 2:29.48 oracle 
2494 oracle 20 0 125g 26m 24m S 0.3 0.0 1:00.81 oracle 
4853 deployer 20 0 15300 1484 928 R 0.3 0.0 0:00.02 top 
24221 zabbix 20 0 18480 1608 1420 S 0.3 0.0 11:28.59 zabbix_agentd
。。。。。。

默认是每个进程按照CPU使用率由高到低排序的。

上面显示的结果介绍:

第一行:
00:33:50 — 当前系统时间
386 days, 14:03 — 系统已经运行了386天14小时03分钟(在这期间没有重启过)
1 users — 当前有1个用户登录系统
load average: 0.00, 0.04, 0.01 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

批注:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行:
Tasks — 任务(进程),系统现在共有425个进程,其中处于运行中的有1个,424个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
第三行:cpu状态
0.1% us   — 用户空间占用CPU的百分比。
0.2% sy   — 内核空间占用CPU的百分比。
0.0% ni   — 改变过优先级的进程占用CPU的百分比
99.6% id  — 空闲CPU百分比
0.0% wa   — IO等待占用CPU的百分比
0.0% hi   — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si   — 软中断(Software Interrupts)占用CPU的百分比
第四行:内存状态
264552000k total — 物理内存总量
197559072k used  — 使用中的内存总量
66992928k free   — 空闲内存总量
324000k buffers  — 缓存的内存量
第五行:swap交换分区
134217724k total   — 交换区总量
25448k  used       — 使用的交换区总量
134192276k free    — 空闲交换区总量
190391340k cached  — 缓冲的交换区总量
第六行是空行
第七行以下:各进程(任务)的状态监控
PID     — 进程id
USER    — 进程所有者
PR      — 进程优先级
NI      — nice值。负值表示高优先级,正值表示低优先级
VIRT    — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES     — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR     — 共享内存大小,单位kb
S       — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU    — 上次更新到现在的CPU时间占用百分比
%MEM    — 进程使用的物理内存百分比
TIME+   — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

top的交互命令

多U多核CPU监控

在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:

技术分享

加亮显示一些重要信息

在top基本视图中,按键盘数字“B”,可监控每个逻辑CPU的状况:

技术分享

对于加亮显示x轴/y轴特别显示出来

我们发现进程id为10704的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果。敲击键盘“x”(打开/关闭排序列的加亮效果),top的视图变化如下:

技术分享

常用top操作总结:

top   //每隔5秒显式所有进程的资源占用情况
top -d 2  //每隔2秒显式所有进程的资源占用情况
top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

 3.  性能分析之 vmstat 命令使用


 vmstat命令是Virtual Meomory Statistics(虚拟内存统计)的缩写,是常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率、内存使用、虚拟内存交换情况、IO读写情况。

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

$ vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 1546380 234820 324792 309540 0 0 0 2 0 0 0 0 99 0 0

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:

$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 1546380 235440 324796 309668 0 0 0 2 0 0 0 0 99 0 0
0 0 1546380 235308 324796 309668 0 0 0 78 857 1840 0 0 99 0 0
0 0 1546380 235640 324796 309688 0 0 0 20 1068 1959 0 1 99 0 0
0 0 1546380 235284 324796 309696 0 0 0 8 1517 2137 1 1 98 0 0
1 0 1546380 235284 324796 309696 0 0 0 14 986 1879 0 0 99 0 0
0 0 1546380 235284 324796 309700 0 0 0 0 948 1908 0 0 99 0 0

以上监控结果参数解释如下:

FIELD DESCRIPTION FOR VM MODE
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.

Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)

Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).

IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).

System
in: The number of interrupts per second, including the clock.
cs: The number of context switches per second.

CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.


 4.  性能分析之 mpstat命令使用


 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat最大的特点是:可以查看多核cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况。

mpstat使用语法:

mpstat [-P {|ALL}] [internal [count]]
参数 解释
-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
internal 相邻的两次采样的间隔时间、
count 采样的次数,count只能和delay一起使用
当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。

mpstat使用示例如下:

查看多核CPU核心的当前运行状况信息, 每2秒更新一次,更新5次

$ mpstat 2 5
Linux 2.6.32-504.el6.x86_64 (resuathenan)     08/07/2017     _x86_64_    (8 CPU)

12:03:08 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
12:03:10 PM  all    0.94    0.00    0.82    0.00    0.00    0.00    0.00    0.00   98.24
12:03:12 PM  all    0.25    0.00    0.44    0.00    0.00    0.00    0.00    0.00   99.31
12:03:14 PM  all    0.44    0.00    0.50    0.06    0.00    0.00    0.00    0.00   99.00
12:03:16 PM  all    0.88    0.00    0.82    0.00    0.00    0.00    0.00    0.00   98.30
12:03:18 PM  all    0.63    0.00    0.44    0.00    0.00    0.00    0.00    0.00   98.94
Average:     all    0.63    0.00    0.60    0.01    0.00    0.00    0.00    0.00   98.76

如果要看每个cpu核心的详细当前运行状况信息,输出如下:

$ mpstat -P ALL 2 1
Linux 2.6.32-504.el6.x86_64 (resuathenan)     08/07/2017     _x86_64_    (8 CPU)

12:05:55 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
12:05:57 PM  all    0.63    0.00    0.44    0.00    0.00    0.00    0.00    0.00   98.93
12:05:57 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
12:05:57 PM    1    0.51    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.49
12:05:57 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
12:05:57 PM    3    0.50    0.00    0.50    0.50    0.00    0.00    0.00    0.00   98.50
12:05:57 PM    4    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.00
12:05:57 PM    5    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
12:05:57 PM    6    0.50    0.00    1.51    0.00    0.00    0.00    0.00    0.00   97.99
12:05:57 PM    7    1.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00   97.99

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
Average:     all    0.63    0.00    0.44    0.00    0.00    0.00    0.00    0.00   98.93
Average:       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       1    0.51    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.49
Average:       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:       3    0.50    0.00    0.50    0.50    0.00    0.00    0.00    0.00   98.50
Average:       4    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.00
Average:       5    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
Average:       6    0.50    0.00    1.51    0.00    0.00    0.00    0.00    0.00   97.99
Average:       7    1.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00   97.99

字段含义解释:

%user      在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程  (usr/total)*100
%nice      在internal时间段里,nice值为负进程的CPU时间(%)   (nice/total)*100
%sys       在internal时间段里,内核时间(%)       (system/total)*100
%iowait    在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq       在internal时间段里,硬中断时间(%)     (irq/total)*100
%soft      在internal时间段里,软中断时间(%)     (softirq/total)*100
%idle      在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

计算公式如下:

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。

[转载] Linux常用性能分析命令(一)