常用性能分析工具

top

列含义

vmstat

procs

memory

swap

io

system

cpu

uptime

free

iostat

cpu

Device

sar

mpstat

pmap

netstat

tcpdump

strace

lsof

proc文件系统

Benchmark

 

 

Linux性能调优之前,首先需要了解当前服务的运行状态,找到程序瓶颈,这就需要用到Linux上一系列性能监控工具,以下对常用工具做一些总结。

先来看一张各种工具的图谱,要想了解这张图中所有工具的确切含义,需要对Linux操作系统,以及内核实现有着一定的了解,所有的工具,都可以man具体的使用细节。

 

 

top

top 工具是查看进程信息的常用工具,默认情况下,进程显示会按照cpu负载排序,也可以按照pidtime和内存使用率进行排序。

top - 20:40:53 up 411 days,  2:55,  1 user,  load average: 2.75, 2.65, 2.43

Tasks: 233 total,   1 running, 232 sleeping,   0 stopped,   0 zombie

Cpu(s): 19.9%us,  4.0%sy,  0.0%ni, 71.9%id,  2.7%wa,  0.0%hi,  1.5%si,  0.0%st

Mem:   8052640k total,  8001296k used,    51344k free,    51668k buffers

Swap:  2104504k total,    25832k used,  2078672k free,  6776596k cached

 

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

18161 mqq       20   0 3796m 1.7g 927m S  166 22.1   9171:12 IphonePushServi

  830 mqq       20   0  342m 199m 198m S   23  2.5  49542:15 VideoRelay

 1342 admin     20   0     0    0    0 D    1  0.0 209:54.07 flush-8:0

32390 mqq       20   0  502m 5164 2524 S    1  0.1 162:26.01 tafnode

16238 mqq       20   0  5664 1320  876 R    0  0.0   0:00.02 top

各行含义如下:

第一行:系统信息

20:40:53:系统当前时间

up 411 days, 2:55:系统已经启动时间

1 user:当前登陆的用户数

load average:当前机器负载,三个数分别是1分钟、5分钟、15分钟的负载情况,程序每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行:进程信息

依次分别是,总进成数,运行进程数,sleep进程数,stop进程数,还有僵尸进程数

第三行:cpu信息

us:用户空间占用CPU的百分比

sy:内核空间占用CPU的百分比

ni:改变过优先级的进程占用CPU的百分比

id:空闲CPU百分比

waIO等待占用CPU的百分比

hi:硬中断(Hardware IRQ)占用CPU的百分比

si:软中断(Software Interrupts)占用CPU的百分比

第四行:内存信息

total:总内存大小

used:已经使用内存大小

free:空闲内存大小

buffers:缓存内存大小

第五行:交换区信息

total:总交换区大小

used:已经使用交换区大小

free:空闲交换区大小

cachedcached缓存大小

列含义

各列含义如下:

PID:进程ID

USER:创建者

PRI:进程优先级

NInick level,负值表示高优先级

VIRT:进程使用的虚拟内存总量,单位kbVIRT=SWAP+RES

RES:进程使用的、未被换出的物理内存大小,单位kbRES=CODE+DATA

SHR:共享内存大小,单位kb

S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU:上次更新到现在的CPU时间占用百分比

%MEM:进程使用的物理内存百分比

TIME+:进程使用的CPU时间总计,单位1/100

COMMAND:进程名

另外,按1可以显示各个cpu情况,top -H可以显示各个线程情况。

vmstat

vmstat 可以查看进程、内存、分页、IOCPU等信息,执行vmstat 2(2秒统计一次),输出如下:

procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 4  0  25832  50440  52928 6841116    0    0   125   192    0    0  6  2 91  0  0

 2  0  25832  50440  52932 6839432    0    0     0     0 48744 61153 19  6 76  0  0

 2  0  25832  53176  52944 6836144    0    0     0   370 48132 63201 19  6 75  0  0

 2  0  25832  52184  52952 6836428    0    0     0    30 48525 63944 19  5 75  0  0

注意:第一行数据显示系统上次启动后到现在的平均负载,需要排除在外。

procs

r:等待执行的进程数(显示cpu正在执行和等待cpu资源的进程数,该数字大于cpu个数,可能出现cpu性能瓶颈)

b:等待IO的进程数

memory

swpd:正在使用的虚拟内存大小

free:空闲内存大小

buff:已用的 buff 大小,对块设备的读写进行缓冲

cache:文件系统缓存 cache 大小

swap

si:每秒从交换区写入内存的大小(kb/s

so:每秒从内存写到交换区的大小

io

bi:每秒读取的块数(读磁盘)

bo:每秒写入的块数(写磁盘)

system

in:每秒中断数,包括时钟中断

cs:每秒上下文切换数

cpu

含义见 top-cpu信息

uptime

 top 第一行:系统信息

free

free 命令主要查看内存的使用情况:

             total       used       free     shared    buffers     cached

Mem:       8052640    8000400      52240          0      52872    6853252

-/+ buffers/cache:    1094276    6958364

Swap:      2104504      25832    2078672

第二行含义:

total:总物理内存大小

used:已使用内存大小(包括系统cache

free:空闲内存大小

shared:多个进程共享的内存大小

buffersbuffer大小(块设备缓存)

cachedcache大小(文件系统缓存)

第三行:

used/free:已使用内存大小和空闲内存大小,跟第二行相同字段的区别在于减去了buffercachebuffercache从操作系统角度来讲是已经使用的内存,但当系统可用内存不足时,操作系统会释放buffercache,对进程来讲,这部分内存也是可用的。

第四行:参考 top

iostat

此命令用户输出cpu和磁盘io相关的统计信息,默认不加参数输出的是系统启动后到现在的统计情况,一般当系统启动很长时间以后,不具有太大的参考意义:

Linux 2.6.32.43-tlinux-1.0.8-state (10_135_11_35_kqq)   01/13/2015      _x86_64_

 

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           5.64    0.49    2.84    0.41    0.00   91.20

 

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda              25.64      2006.79      3075.79 71288307775 109262888974

sda1              0.99        14.09         5.05  500582972  179528792

sda2              0.00         0.00         0.00      13182     142936

sda3              3.54        25.77        80.34  915263981 2853850978

sda4             21.11      1966.93      2990.39 69872425096 106229366268

字段含义如下:

cpu

%user: 在用户级别运行所使用的CPU的百分比

%nice: nice操作所使用的CPU的百分比

%sys: 在系统级别(kernel)运行所使用CPU的百分比

%iowait: CPU等待硬件I/O,所占用CPU百分比

%idle: CPU空闲时间的百分比

Device

tps: 每秒钟发送到的I/O请求数

Blk_read /s: 每秒读取的block

Blk_wrtn/s: 每秒写入的block

Blk_read: 读入的block总数

Blk_wrtn: 写入的block总数

另外,iostate可以加入一些参数执行更为丰富的功能:

iostat -d 2:每隔两秒统计一次(注:第一行仍然显示系统启动至今的统计)iostat -x -d 2:显示更加详细的信息,2秒统计一次 iostat -d 2 6:两秒统计一次,统计6

其中,-x参数显示详细信息,具体字段如下:

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.50     0.00   19.50    4.50   332.00  1772.00   166.00   886.00    87.67     0.27   77.67   3.08   7.40

解释:

rrqm/swrqm/s):将读(写)入请求合并后,每秒发送到设备的读(写)入请求数

r/sw/s):每秒发送到设备的读(写)入请求数

rsec/swsec/s):每秒从设备读(写)入的扇区数

rkB/swkB/s):每秒从设备读(写)入的数据量,单位为K

avgrq-sz:发送到设备的请求的平均大小,单位是扇区

avgqu-sz 发送到设备的请求的平均队列长度

awaitI/O请求平均执行时间,包括发送请求和执行的时间,单位是毫秒

svctm:发送到设备的I/O请求的平均执行时间,单位是毫秒

%util:在I/O请求发送到设备期间,占用CPU时间的百分比(此值越大,表示设备占用率越高,100时表示设备已占满)

sar

sar 可以显示多种系统资源,具体命令格式:

sar [options] [-A] [-o file] t [n]

在命令行中, t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,默认值是1-o file表示将命令结果以二进制格式存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项。

sar 常用的命令选项有:

-A:所有报告的总和

-uCPU利用率

-v:进程、I节点、文件和锁表状态

-d:硬盘使用报告

-r:没有使用的内存页面和硬盘块

-g:串口I/O的情况

-b:缓冲区使用情况

-a:文件读写情况

-c:系统调用情况

-R:进程的活动情况

mpstat

mpstat 主要显示cpu相关信息,跟 vmstat 相比优点在于可以分别显示各个cpu的情况。执行mpstat -P ALL 1,显示所有CPU状态,采样间隔1s

09:52:44 PM  CPU    %user   %nice    %sys %iowait    %irq   %soft  %steal  %idle    %intr/s    %guest

09:52:45 PM  all   19.43    0.00    4.86    3.86    0.00    1.99    0.00   69.86   50984.00    0.00

09:52:45 PM    0   33.33    0.00    5.05    0.00    0.00    2.02    0.00   59.60    4623.00    0.00

09:52:45 PM    1   27.72    0.00    4.95    0.00    0.00    0.99    0.00   66.34    5771.00    0.00

参数含义:

%user:表示处理用户进程所使用 CPU 的百分比

%nice:表示使用 nice 命令对进程进行降级时 CPU 的百分比

%sys:表示内核进程使用的 CPU 百分比

%iowait:表示等待进行 I/O 所使用的 CPU 时间百分比

%irq:表示用于处理系统中断的 CPU 百分比

%soft:表示用于软件中断的 CPU 百分比

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比

%idle:显示 CPU 的空闲时间

%intr/s:显示每秒 CPU 接收的中断总数

pmap

pmap 用于查看进程的内存映像信息。使用方式:pmap -d <pid>

18161: IphonePushServi

START               SIZE     RSS     PSS   DIRTY    SWAP PERM OFFSET   DEVICE MAPPING

0000000000400000   7292K   3252K   3252K      0K      0K r-xp 0000000000000000 08:04  IphonePushService

0000000000c1f000    116K     92K     92K     44K      0K rw-p 000000000071f000 08:04  IphonePushService

字段含义如下:

START: 内存开始地址

SIZE: 占用内存的字节数(KB

RSS: 保留内存的字节数(KB

Dirty: 脏页的字节数(包括共享和私有的)

PERM: 内存的权限

Offset: 文件偏移

Device: 设备名 (major:minor)

MAPPING: 对应的映像文件名

netstat

netstat 是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCPUDP监听,进程内存管理的相关报告。

该命令的一般形式:netstat [-a][-e][-n][-o][-p Protocol][-r][-s][Interval],执行netstat -anop 显示信息:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name Timer

tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      -                off (0.00/0/0)

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -                off (0.00/0/0)

tcp        0      0 127.0.0.1:8088          0.0.0.0:*               LISTEN      24346/tunnel     off (0.00/0/0)

其中需要关注Recv-QSend-Q,分别表示发送队列和接受队列大小,当Recv-Q过大,意味着当前程序无法及时接收数据包,Send-Q过大,表示对端网络状况不好或者达到对端性能瓶颈。

tcpdump

tcpdump 可以截获网络数据包,对于网络协议的联调和测试有很大的辅助作用。

tcpdump 它的命令格式为:

tcpdump [-adeflnNOpqStvx] [-c 数量] [-F filename] [-i 网络接口] [-r 文件名] [ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式]

选项说明:

-a 将网络地址和广播地址转变成名字

-d  将匹配信息包的代码以人们能够理解的汇编格式给出

-dd  将匹配信息包的代码以c语言程序段的格式给出

-ddd  将匹配信息包的代码以十进制的形式给出

-e  在输出行打印出数据链路层的头部信息

-f  将外部的Internet地址以数字的形式打印出来

-l  使标准输出变为缓冲行形式

-n  不把网络地址转换成名字

-t  在输出的每一行不打印时间戳

-v  输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息

-vv  输出详细的报文信息

-c  在收到指定的包的数目后,tcpdump就会停止

-F  从指定的文件中读取表达式,忽略其它的表达式

-i  指定监听的网络接口

-r  从指定的文件中读取包(这些包一般通过-w选项产生)

-w  直接将包写入文件中,并不分析和打印出来

-T  将监听到的包直接解释为指定的类型的报文,常见的类型有 rpc  snmp

strace

strace 可以查看一个进程所调用的系统api情况,在某些情况下,知道系统所调用的api,可以判断程序运行时的一些状态,该命令使用方式:strace -p <PID>。可以查看调用的api和参数。

lsof

lsof 是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以 文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,通过lsof工具能够查看这个列表的详细信息。

lsof 的使用方法可以参考这里。这里列出几种常见的用法。

查看文件系统阻塞 lsof /boot

查看端口号被哪个进程占用 lsof -i :3306

查看用户打开哪些文件 lsof -u username

查看进程打开哪些文件 lsof -p 4838

查看远程已打开的网络链接lsof -i @192.168.34.128

proc文件系统

Linux/proc/是很特殊的文件系统,存储了内核当前运行状态的虚拟文件系统

/proc/meminfo:当前系统内存状态

/proc/cpuinfocpu状态

/proc/<PID>PID进程信息

/proc/<PID>/cmdline:进程执行命令行信息

/proc/<PID>/exe:软链接,指向当前执行进程

/proc/sys/net/ipv4/tcp_wmemtcp write buffer值,分别表示:最小,默认,最大

Benchmark

除了监控系统和程序状态的工具,另外还有一些工具用于测试系统本身固有的性能,如果两台机器之间本身的网络传输有瓶颈,不论程序写的多优秀,也不能突破这种限制。所以适当的时候,或者评估阶段,有时候通过测试系统固有的特定,是一个好的选择。

 

工具

功能

Lmbench

反应时间测评工具,上下文切换,网络:连接的建立,管道,文件系统的建立和删除,内存读入反应时间等等

IOzone

测试不同的操作系统中文件系统的读写性能

netperf

测试网络的性能

bonnie

磁盘IO和文件系统测试

iperf

网络测试

ab(Apache)

web server 测试

 

其中 Lmbench 可以测试读写内存,网络建立,上下文切换等性能,这可以提供给我们很好的参考,作为开发人员,一定需要了解各种性能指标,甚至主要api调用性能,才能更合理的使用。

猜你喜欢

转载自blog.csdn.net/u011244446/article/details/60600424