录
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负载排序,也可以按照pid,time和内存使用率进行排序。
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百分比
wa:IO等待占用CPU的百分比
hi:硬中断(Hardware IRQ)占用CPU的百分比
si:软中断(Software Interrupts)占用CPU的百分比
第四行:内存信息
total:总内存大小
used:已经使用内存大小
free:空闲内存大小
buffers:缓存内存大小
第五行:交换区信息
total:总交换区大小
used:已经使用交换区大小
free:空闲交换区大小
cached:cached缓存大小
列含义
各列含义如下:
PID:进程ID
USER:创建者
PRI:进程优先级
NI:nick level,负值表示高优先级
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:进程名
另外,按1可以显示各个cpu情况,top -H可以显示各个线程情况。
vmstat
vmstat 可以查看进程、内存、分页、IO和CPU等信息,执行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:多个进程共享的内存大小
buffers:buffer大小(块设备缓存)
cached:cache大小(文件系统缓存)
第三行:
used/free:已使用内存大小和空闲内存大小,跟第二行相同字段的区别在于减去了buffer和cache,buffer和cache从操作系统角度来讲是已经使用的内存,但当系统可用内存不足时,操作系统会释放buffer和cache,对进程来讲,这部分内存也是可用的。
第四行:参考 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/s(wrqm/s):将读(写)入请求合并后,每秒发送到设备的读(写)入请求数
r/s(w/s):每秒发送到设备的读(写)入请求数
rsec/s(wsec/s):每秒从设备读(写)入的扇区数
rkB/s(wkB/s):每秒从设备读(写)入的数据量,单位为K
avgrq-sz:发送到设备的请求的平均大小,单位是扇区
avgqu-sz: 发送到设备的请求的平均队列长度
await:I/O请求平均执行时间,包括发送请求和执行的时间,单位是毫秒
svctm:发送到设备的I/O请求的平均执行时间,单位是毫秒
%util:在I/O请求发送到设备期间,占用CPU时间的百分比(此值越大,表示设备占用率越高,100时表示设备已占满)
sar
sar 可以显示多种系统资源,具体命令格式:
sar [options] [-A] [-o file] t [n]
在命令行中,n 和 t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果以二进制格式存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项。
sar 常用的命令选项有:
-A:所有报告的总和
-u:CPU利用率
-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
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连接,TCP和UDP监听,进程内存管理的相关报告。
该命令的一般形式: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-Q,Send-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
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/cpuinfo:cpu状态
/proc/
/proc/
/proc/
/proc/sys/net/ipv4/tcp_wmem:tcp write buffer值,分别表示:最小,默认,最大
除了监控系统和程序状态的工具,另外还有一些工具用于测试系统本身固有的性能,如果两台机器之间本身的网络传输有瓶颈,不论程序写的多优秀,也不能突破这种限制。所以适当的时候,或者评估阶段,有时候通过测试系统固有的特定,是一个好的选择。
工具 |
功能 |
Lmbench |
反应时间测评工具,上下文切换,网络:连接的建立,管道,文件系统的建立和删除,内存读入反应时间等等 |
IOzone |
测试不同的操作系统中文件系统的读写性能 |
netperf |
测试网络的性能 |
bonnie |
磁盘IO和文件系统测试 |
iperf |
网络测试 |
ab(Apache) |
web server 测试 |
其中 Lmbench 可以测试读写内存,网络建立,上下文切换等性能,这可以提供给我们很好的参考,作为开发人员,一定需要了解各种性能指标,甚至主要api调用性能,才能更合理的使用。