Linux系统有很多查询性能指标的工具,以下介绍几个常用且使用广泛的工具
top
其中1处的三个数值就是平均负载
2处默认是显示所有cpu的统计信息,通过按数字1切换到显示单核cpu的信息
us%:user,用户态cpu时间百分比
sy%:system,内核态cpu时间百分比
ni%:nice,低优先级用户态cpu时间百分比
id%:idle,空闲状态cpu时间百分比
wa%:iowait,等待io状态cpu时间百分比
hi%:irq,处理硬中断的cpu时间百分比
si%:softirq,处理软中断的cpu时间百分比
st%:steal,窃取cpu时间百分比
下面有内存和交换区的统计信息
后面各行是进程的信息
一些交互操作有:
按h帮助,按q退出
通过按M(m大写),按%MEM排序;P,%CPU排序;N,按PID排序;T,按TIME+排序;R,改变排序顺序,顺序排或者倒序排。
进程的统计数据中,一些列说明如下:
PR:进程的优先级,值越小表示越高的优先级
NI:nicevalue,也是优先级相关的,负数表示高优先级,正数表示低优先级,0表示这个任务的优先级不会被调整
VIRT:进程使用的虚拟内存的大小
RES:进程的常驻内存的大小
SHR:进程的共享内存的大小
S,即Status,表示进程状态,其中:
D(disk sleep):不可中断睡眠状态,一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断
R:running or runnable,正在运行或者正在等待运行
S(Interruptible Sleep):可中断状态睡眠,当进程等待的事件发生时,它被唤醒并进入R状态
T:进程处于暂停或者跟踪状态
Z(Zombie):僵尸进程:因为父进程没有回收子进程的资源而出现,要解决掉它们,就要找到他们的根儿,也就是找出父进程,然后在父进程里面解决,比如调用wait()或waitpid(),或者注册SIGCHLD信号的处理函数
I(idle):空闲状态
以上是top命令的介绍。
sar 这个命令通过不同的参数可以查询不同类型的指标,用处很多
sar不带任何参数或者sar -u输出的是cpu使用情况
sar-d 磁盘IO使用率、iops、吞吐量、响应时间、io平均大小以及等待队列长度
输出1次最近5秒的磁盘统计数据
tps:设备每秒传输次数
rd_sec/s:每秒从设备读出的扇区数,一个扇区大小为512字节
wr_sec/s:每秒写入设备的扇区数
avgrq-sz:发送给设备的请求的平均大小(以扇区为单位)
avgqu-sz:发出给设备的请求的平均队列长度
await:IO请求的平均等待时间(毫秒)
svctm:平均服务时间(毫秒)
%util:设备的带宽利用率(100%代表带宽利用饱和)
sar-n { keyword [,...] | ALL } 报告网络统计
其中keyword有:DEV, EDEV, NFS, NFSD, SOCK,IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 and UDP6
间隔5秒统计一次网络收发,其中:
IFACE:网卡名字
rxpck/s,txpck/s:分别表示每秒接收、发送的网络帧数,也就是PPS
rxkB/s,txkB/s:分别表示每秒接收、发送的千字节数,也就是BPS
rxcmp/s,txcmp/s:每秒接收、发送的压缩数据包数
rxmcst/s:每秒收到的组播数据包数
如果keyword不同,则输出的数据也不一样,具体可以man手册
sar-r 报告内存利用率统计信息
kbmemfree:可用内存量(kb)
kbmemused:已用内存量,不包括内核本身使用的量
%memused:已用内存百分比
kbbuffers:内核使用的buffers的量
kbcached:内核使用的cache的量
kbcommit:保证当前系统运行不发生内存溢出需要的内存量
%commit:kbcommit与总内存的比值
Buffer:既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”
Cache:既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”
可见sar命令可以查看cpu,内存,磁盘,网络等各模块的性能指标
vmstat:常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析CPU上下文切换和中断的次数
格式:vmstat [参数][delay [ count]]
vmstat的默认输出:
其中procs列
r:等待执行的线程数
b:处于不可中断睡眠状态的线程数
memory(单位 kB)
swpd:虚拟内存大小
free:空闲状态内存大小
buff:作为buff使用的内存大小
cache:作为cache的内存大小
swap
si:每秒从磁盘换入的内存数量
so:每秒向磁盘换出的内存数量
io
bi:每秒从块设备收到的块数量(1个块=1024bytes)
bo:每秒发送到块设备的块数量
system
in:每秒中断的次数
cs:每秒上下文切换的次数
cpu
各列可以参考top中关于cpu的说明
vmstat -s:以表格形式显示各种事件计数器和内存统计信息
vmstat -w:以更大的宽度显示各指标
vmstat -S K/M 以1024bytes或者1048576bytes输出内存量
pidstat:常用的进程性能分析工具,用来实时查看进程的CPU 内存 I/O以及上下文切换等性能指标
pidstat [参数] [interval [count]]
pidstat -C comm 仅展示那些任务名中包含comm的任务
pidstat -d 输出IO统计
kB_rd/s:任务每秒从磁盘读取的数据大小(kB)
kB_wr/s:任务每秒发出的写请求数据大小
kB_ccwr/s:每秒取消的写请求数据大小
pidstat -l 展示任务启动参数
pidstat -p 进程号/ALL 查看指定进程或者所有进程的cpu使用情况
pidstat -t 同时展示线程的情况
pidstat -r 报告缺页错误和内存利用率
minflt/s :每秒发生的小缺页错误数(即不需要从磁盘加载内存页)
majflt/s:每秒发生的大缺页错误数
VSZ:任务的虚拟内存使用量(kB)
RSS:任务的常驻内存使用量(kB)
pidstat -u 输出cpu的利用率
pidstat -w 报告任务切换活动
cswch/s:任务每秒自愿上下文切换次数
nvcswch/s:任务每秒非自愿上下文切换次数(任务执行的时间片用完不得不放弃处理器时发生的切换即为非自愿上下文切换)
iostat:最常用的磁盘I/O性能观测工具,它提供了每个磁盘的使用率、IOPS、吞吐量等各种常见的性能指标
iostat [ -c ] [ -d ][ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [-x ] [ -y ] [ -z ] [ interval [count ] ]
r/s:每秒发送给磁盘的读请求数(合并后的请求数)
w/s:每秒发送给磁盘的写请求数(合并后的请求数)
rkB/s:每秒从磁盘读取的数据量(kB)
wkB/s:每秒向磁盘写入的数据量(kB)
rrqm/s:每秒合并的读请求数
wrqm/s:每秒合并的写请求数
rsec/s:每秒从磁盘读取的扇区数
wsec/s:每秒向磁盘写入的扇区数
r_await:读请求处理完成等待时间(包括队列中的等待时间和设备实际处理的时间,单位为毫秒)
w_await:写请求处理完成等待时间(包括队列中的等待时间和设备实际处理的时间,单位为毫秒)
avgrq-sz:发送给设备的平均请求大小(以扇区为单位)
aqu-sz/avgqu-sz:平均请求队列长度
rareq-sz:平均读请求大小(单位为kb)
wareq-sz:平均写请求大小(单位为kb)
svctm:处理I/O请求所需的平均时间(不包括等待时间,单位为毫秒)
%util:磁盘处理I/O的时间百分比,即使用率,由于可能存在并行i/o,100%并不一定表名磁盘IO饱和
以上指标:
%util,就是我们说的磁盘io使用率
r/s+w/s,就是IOPS
r_await+w_await,就是响应时间
ss(netstat的替代工具)
命令格式:ss[options] [ FILTER ]
ss -a 同时显示侦听和不侦听的socket
ss -l 只显示侦听的socket
ss -o 显示计时器信息
ss -s 打印摘要统计信息
ss -t 显示tcp socket
ss -u 显示UDP socket
FILTER的例子:
ss -o state established '(dport=:ssh or sport = :ssh)'
显示所有已建立的ssh连接
tcpdump
tcpdump [选项][过滤表达式]
我们通过一个命令说明tcpdump的用法:
tcpdump -nn udp port53 or host 35.190.27.188
-nn:表示不解析抓包中的域名(即不反向解析)、协议和端口号
udp port 53 表示只显示udp协议端口号(源端口和目的端口)为53的包
host xxx 表示只显示ip地址(源地址和目的地址)为xxx的包
or 表示或的关系,只要满足一个就行
tcpdump -i eth0:指定网络接口,默认是0号接口(如eth0),any表示所有接口
tcpdump -c 5 :限制要抓取网络包的个数
tcpdump -A :以ASCII码形式显示网络包内容(不指定时只显示头部信息)
tcpdump -w file.pcap:保存到文件中,文件名通常以.pcap为后缀,后续可以把文件载入wireshark分析
tcpdump -n 不要将主机地址转换为名称。这可以用例避免DNS查找
tcpdump -S 打印绝对的而不是相对的TCP序列号
tcpdump -e 输出链路层的头部信息
tcpdump的输出格式:
时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络部详细信息
以上就是linux各大模块常用的性能工具,每个命令都有很多参数,我们很难记住所有的参数和输出项所代表的意义,推荐在实际使用的时候,通过man查询手册,另外linux的命令说明中[]括起来都是表示这个参数是可选的。实际使用中我们可以根据性能指标先确定性能工具,再通过性能工具的说明文档了解输出的性能指标的内在意义,从而指导我们分析判断