Linux 性能分析常用命令
1. CPU
- top
2. 内存
-
cat /proc/sys/vm/drop_caches触发回收缓存 -
nm: nm查看进程符号表
-
sar:
sar -r 1查看内存情况
-
sar:
sar -B可以看到内存中断的情况
-
vmstat:
vmstat 1
参数
1表示1s采集一次。
| 参数 | 含义 |
|---|---|
| r | 表示运行队列(就是说多少个进程真的分配到CPU),如果这个值超过了CPU个数,则会出现CPU瓶颈 |
| b | 表示阻塞的进程队列,比如网络收发、磁盘读写的时候 |
| swpd | 虚拟内存已使用的大小,如果大于0,表示机器物理内存不足了,如果不是程序内存泄露的原因,那么需要升级内存或者把耗内存的任务迁移到其他机器。 |
| free | 空闲的物理内存的大小 |
| buff | Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存 |
| cache | cache直接用来记忆我们打开的文件,给文件做缓冲。(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用) |
| si | 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常 |
| so | 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上 |
| bi | 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒 |
| bo | 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整 |
| in | 每秒CPU的中断次数,包括时间中断 |
| cs | 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。 |
| us | 用户CPU时间 |
| sy | 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁 |
| id | 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率 |
| wt | 等待IO CPU时间 |
-
mpstat:
mpstat -P ALL 1如果说
vmstat查看的是全局CPU信息,那么mpstat可以查看具体CPU的负载
| 参数 | 释义 | 从/proc/stat获得数据 |
|---|---|---|
| CPU | 处理器ID | |
| %usr | 在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 |
| %steal | 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比 | steal/total*100 |
| %guest | 显示运行虚拟处理器时CPU花费时间的百分比 | guest/total*100 |
| %gnice | gnice/total*100 | |
| %idle | 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) | idle/total*100 |
cat /proc/sys/vm/swappiness 内存不够时从page cache还是swap回收的选择权重
3. 网络
-
netstatnetstat -anpt可以查看TCP套接字,加-anpu参数可查看UDP
除了查看连接状态外,有时候还需要注意
Recv-Q和Send-Q两个收发队列的大小netstat -s可以列举出所有网络协议的收到包情况,对TCP可以看到主动打开和被动打开的连接数
-
ifconfigifconfig最主要的 用途就是用来查看本机IP了,但是除了查看ip以外,还有一些参数值得注意
txqueuelen为网卡队列的长度RX packets和TX packets分别为收发包的个数 -
routeroute -n用来查看路由表 -
ssss -anpt效果基本等同于netstat -anpt,不过ss -anpt基础上再加i参数可以更详细显示socket信息 -
pingping命令应该很熟悉了,常用ping来测试网络状态,比如ping baidi.com得到如下输出
我们要注意到最后一行的4个值,分别表示rtt的最小、平均、最大和方差值
此外,我们还可以用
-f参数进行flood ping,以此来压测网络
/proc/sys/net/core/somaxconn 每一个端口最大的监听队列长度,listen()中的参数
4. 磁盘
-
iostat:
iostat -xz 1iostat用来统计磁盘的使用信息,不加参数时显示的是机器从开始到现在是所有值。
| 参数 | 含义 |
|---|---|
| rrqm/s | xxxxx |
| wrqm/s | xxxxx |
| r/s | xxxxx |
| w/s | xxxxx |
| rKB/s | xxxxx |
| wKB/s | xxxxx |
| avgrq-sz | average request size,平均每次读写磁盘时的请求长度,如果值较大,则说明顺序读写较多,否则随机读写较多 |
| avgqu-sz | average queue size,平均请求队列的长度。毫无疑问,队列长度越短越好 |
| await | 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。 |
| r_await | 读队列等待时间 |
| w_await | 写队列等待时间 |
| svctm | xxxxx |
| %util | 以此判断当前的IO负载。在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度 |
| 。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。 |
-
sar:
sar -n DEV 1,sar -n TCP,ETCP 1 -
iotop
我们都知道
top可以用来查看系统的CPU性能,与之对应的,我们通过iotop来查看系统的IO性能,不加任何参数,输入如下:
其中第一列
TID是线程ID,如果要查看进程ID,则可以加上-P参数,我们最关心的是前两行。 -
pmap
-
strace
strace -ttstrace -tt ls查看ls命令中各个系统调用的耗时,也可以通过-p参数指定进程。 -
lsof
lsof -p $$查看当前进程打开的fd
-
dstat
- uptime
- dmesg
- pidstat:
pidstat 1 - htop
Linux内存回收优先级buffer/cache->swap->oom
上一篇: Linux程序性能调优之gprof和oprofile
下一篇: 数据库事务中MVCC的实现

