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. 网络
-
netstat
netstat -anpt
可以查看TCP套接字,加-anpu
参数可查看UDP除了查看连接状态外,有时候还需要注意
Recv-Q
和Send-Q
两个收发队列的大小netstat -s
可以列举出所有网络协议的收到包情况,对TCP可以看到主动打开和被动打开的连接数 -
ifconfig
ifconfig
最主要的 用途就是用来查看本机IP了,但是除了查看ip以外,还有一些参数值得注意txqueuelen
为网卡队列的长度RX packets
和TX packets
分别为收发包的个数 -
route
route -n
用来查看路由表 -
ss
ss -anpt
效果基本等同于netstat -anpt
,不过ss -anpt
基础上再加i
参数可以更详细显示socket信息 -
ping
ping
命令应该很熟悉了,常用ping
来测试网络状态,比如ping baidi.com
得到如下输出我们要注意到最后一行的4个值,分别表示rtt的最小、平均、最大和方差值
此外,我们还可以用
-f
参数进行flood ping,以此来压测网络
/proc/sys/net/core/somaxconn
每一个端口最大的监听队列长度,listen()
中的参数
4. 磁盘
-
iostat:
iostat -xz 1
iostat
用来统计磁盘的使用信息,不加参数时显示的是机器从开始到现在是所有值。
参数 | 含义 |
---|---|
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 -tt
strace -tt ls
查看ls命令中各个系统调用的耗时,也可以通过-p
参数指定进程。 -
lsof
lsof -p $$
查看当前进程打开的fd -
dstat
- uptime
- dmesg
- pidstat:
pidstat 1
- htop
Linux内存回收优先级buffer/cache->swap->oom
上一篇: 与腾讯相忘于江湖