您现在的位置是: 网站首页 > 程序设计  > Linux 

Linux 性能分析常用命令

2020年9月19日 00:48 1486人围观

简介我们知道,现代计算机由CPU、内存、网络、磁盘等4个模块组成,在这4个模块中,任何一个模块都可能成为瓶颈,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-QSend-Q两个收发队列的大小

    netstat -s 可以列举出所有网络协议的收到包情况,对TCP可以看到主动打开和被动打开的连接数

  • ifconfig

    ifconfig 最主要的 用途就是用来查看本机IP了,但是除了查看ip以外,还有一些参数值得注意

    txqueuelen 为网卡队列的长度 RX packetsTX 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 1sar -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