Linux中常用的查看性能工具有stat家族,sar,tsar,top等,下面分别介绍一下如何使用。
/proc/stat,/proc/loadavg,/proc/uptime
介绍这些工具之前需要先看一下/proc/下的几个文件,因为上面的工具有的数据就是从这里面得来。
/proc/stat
cat /proc/stat
数据格式
文件中的数据格式是这个样子的:
name user nice system idle iowait irrq softirq steal guest guest_nice
cpu 22516651 445 15105690 228802304 1070306 0 446570 0 0 0
# CPU这一行是总的CPU数据,下面是每个CPU的数据
数据解释
- name:cpu序号
- user:用户态时间,不包含 nice值为负的进程
- nice:nice用户态时间,nice值为负的进程所占用的CPU时间
- system:内核态时间
- idle:空闲时间,不包含IO等待时间
- iowait:硬盘IO等待时间
- irrq:硬中断时间
- softirq:软中断时间
- steal:被盗时间,虚拟化环境中运行其他操作系统花费的时间
- guest:来宾时间,操作系统运行虚拟CPU花费的时间
- guest_nice:nice来宾时间,运行一个带nice值的guest花费的时间
- intr:中断的数据,第一列 10467982474 为自系统启动以来,发生的所有的中断的次数。然后每个数对应一个特定的中断自系统启动以来所发生的次数。
- ctxt:自系统启动以来CPU发生的上下文交换的次数
- btime:系统启动到现在的时间,单位为秒(s)
- processes:自系统启动以来创建的任务数
- procs_running:当前运行队列的任务数
- procs_blocked:当前被阻塞的任务数
- softirq:最后一行,所有CPU的软中断总数,第一列是所有软件的总数,后面的列是特定softirq的总数
说明
- 以上所有数据单位都是jiffies,1 jiffies = 0.01s = 10ms。
- CPU时间 = user + system + nice + idle + iowait + irq + softirq
- iowait时间是不可靠值:
- CPU不会等待I/O执行完成。当CPU进入idle状态,很可能会调度另一个task执行,所以iowait计算时间偏小;
- 多核CPU中,iowait的计算并非某一个核,因此计算每一个cpu的iowait非常困难。
/proc/loadavg
cat /proc/loadavg
该文件中的所有值都是从系统启动开始累计到当前时刻。
数据解释
- loadavg_1 (0.86) :1-分钟平均负载
- loadavg_5 (1.07) :5-分钟平均负载
- loadavg_15(1.04) :15-分钟平均负载
- nr_running (1) :在采样时刻,队列中的运行任务数,与/proc/stat的procs_running一个意思。
- nr_threads (2208) :在采样时刻,系统中活跃的任务数(不包括运行已经结束的任务)
- last_pid(24921) :最大的pid值,包括线程。
说明
我的机器有8个CPU,则每个CPU的当前任务数为0.86/8=0.10
/proc/uptime
cat /proc/uptime
数据解释
7084904.93:开机到现在的时间,单位为秒
48354120.04:开机到现在CPU空闲时间,单位为秒
uptime
数据解释
- 15:32:17:现在时间
- up 82 days, 22 min:系统已经运行的时间
- 1 user:目前有多少登陆用户
- 0.38:1分钟系统平均负载
- 0.46:5分钟系统平均负载
- 0.67:15分钟系统平均负载
load average的数据从/proc/loadavg中获得
说明
通常来说:如果系统有n个CPU而且平均负载小于n,则说明某些CPU还有空闲的时间片。通过该命令,你能知道CPU是否繁忙,但是无法知道为什么忙。比如我现在的机器就很闲。
vmstat
Virtual Meomory Statistics 即虚拟内存统计,会统计进程信息、内存、交换区、IO、磁盘、CPU 等数据
语法格式
vmstat [options] [delay [count]]
# options:命令行参数,可选
# delay:间隔多久统计一次数据,可选
# count:统计次数
# 注意:若只传了 delay,则统计次数是无限次,结束统计后会打印本次所有数据的平均值
参数解释
- -a:显示活跃和非活跃内存
- -f:显示从系统启动至今的fork数量 。
- -m:显示slabinfo
- -n:只在开始时显示一次各字段名称。
- -s:显示事件计数器详细信息。
- -d:显示磁盘相关统计信息。
- -D:显示磁盘摘要信息
- -p:显示指定磁盘分区统计信息
- -S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
- -w:数据对齐的格式输出
- -t:显示时间戳
- -V:显示vmstat版本信息。
数据解释
vmstat -w
procs:进程状态
r: 队列中运行进程数
b::等待IO的进程数
memory:内存信息
swpd:使用虚拟内存大小
free:可用内存大小
buff:用作缓冲的内存大小
cache:用作缓存的内存大小
inact:不活动的内存大小(-a)
active:活动的内存大小(-a)
swap:交换区
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
io:io 读写信息
bi: 每秒读取的块数
bo: 每秒写入的块数
system:系统信息
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
CPU:CPU 详细信息
us: 用户进程CPU使用率
sy: 系统进程CPU使用率
id: 空闲CPU百分比
wa: 等待IO的CPU使用率
st:从虚拟机偷取的CPU百分比
栗子
打印活动内存和不活动内存量
vmstat -a 2 2
以 MB 单位输出结果
vmstat -S M 1 2
数据来源
主要来自这三个文件:/proc/meminfo,/proc/stat,/proc/*stat
vmstat
# 当vmstat不带参数时,对应的输出是从系统启动以来的平均值
# 主要来自 /proc/stat
vmstat -s
# 这些信息的分别来自于 /proc/meminfo 、 /proc/stat 和 /proc/vmstat
vmstat -d
# 这些信息主要来自于 /proc/diskstats
mpstat
Multiprocessor Statistics,输出 CPU 相关信息,在多CPU系统中,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。从/proc/stat获得数据。
语法格式
mpstat [-P {|ALL}] [internal [count]]
# -P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
# internal 时间间隔
# count 次数
数据解释
mpstat 1 2
# 每隔1秒输出一次数据,共输出2次
各个数据的解释和/prco/stat中一样,就不再过多赘述了。
栗子
不带参数,打印平均值
mpstat
指定CPU
mpstat -P 0,1,2 1 2
显示所有 CPU 平均中断次数汇总
mpstat -I SUM 1 2
显示每个 CPU 的中断次数、所有 CPU 平均中断次数
mpstat -I SCPU 1 2 -P ALL
iostat
显示系统CPU使用率和磁盘I/O读写信息
语法格式
参数解释
- -c:只显示CPU信息
- -d:只显示磁盘信息
- -g:将信息合并到group_name组中
- -H:和-g一起使用,只显示总的设备情况
- -h:人性化输出
- -p:只显示特定设备统计信息
- -k:以Kb/s为单位
- -m:以mb/s为单位
- -o:以json格式输出
- -t:显示时间戳
- -V:显示版本
- -x:打印扩展的详细信息
- -y:忽略第一次的统计信息
- -z:忽略采样期间没有任何活动的设备信息
数据解释
avg-cpu
和/proc/stat中信息一致。
Device I/O
tps:设备每秒的I/O请求次数
kB_read/s:每秒从设备读取的数据量
kB_wrtn/s:每秒从设备写入的数据量
kB_read:读取的总数据量
kB_wrtn:写入的总数据量
栗子
定时显示所有信息
iostat 1 2
只显示系统 CPU 信息和时间戳
iostat -t -c
只显示系统磁盘信息
iostat -d vda
显示指定磁盘和其分区信息,并友好显示
iostat -p vda -h
整合所有设备的磁盘信息
iostat -g all_device
忽略没有活动的设备的统计信息和第一次统计的信息
iostat -z -y 1 2
显示更详细的统计信息
iostat -x -d 1 2
说明
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈或者磁盘损坏。
pidstat
主要用于监控全部或指定进程占用系统资源的情况。如CPU,内存、设备IO、任务切换、线程等。
语法格式
栗子
pidstat 1
# 每隔 1s 统计打印一次数据,统计无限次
pidstat 2 3
# 每隔 2s 统计打印一次数据,共统计 3次
查看活动进程的 CPU 统计信息(-u)
pidstat 1 2 等同于 pidstat -u 1 2
- UID:进程的用户标识
- PID:进程ID
- %usr:用户态CPU使用率
- %system:内核态CPU使用率
- %guest:运行虚拟机CPU使用率
- %CPU:总的CPU使用率
- CPU:进程在哪个CPU上运行
- Command:进程的命令
查看活跃进程的 I/O 读写情况(-d)
pidstat -d 1 3
- kB_rd/s:每秒读取的KB数
- kB_wr/s:每秒写入的KB数
- kB_ccwr/s:每秒取消写入的KB数
查看活跃进程的上下文切换次数(-w)
pidstat -w 1 3
- cswch/s:每秒自愿上下文切换次数
- nvcswch/s:每秒非自愿上下文切换次数
查看活跃进程的内存使用情况(-r)
pidstat -r 1 3
- minflt/s:每秒不需要从磁盘加载内存页面的次要故障总数
- majflt/s:每秒需要从磁盘加载内存页面的主要故障总数
- VSZ:进程使用的虚拟内存大小(KB)
- RSS:进程使用非交换区的物理内存大小(KB)
- %MEM:进程使用的内存百分比
查看活跃进程的堆栈利用率(-s)
pidstat -s 1 3
- StkSize:进程保留堆栈的内存量
- StkRef:进程利用堆栈的内存量
显示或指定用户名(-U)
pidstat -U 1 2
pidstat -U root 1 2
只显示指定pid的信息(-p)
pidstat -p 2887 1 2
显示进程关联的线程的统计信息(-t)
pidstat -t 1 2
详细的输出进程命令和所有参数(-l)
pidstat -l 1 1
sar
System Activity Reporter 系统活跃情况报告。sar工具将对系统当前的状态进行采样,然后通过计算数据和比例来表示系统的当前运行状态。它的特点是可以连续对系统采样,获得大量的采样数据;采样数据和分析的结果都可以存入文件,所需的负载很小。
sar的数据是一段时间保存的内容,因此可以查看过去的信息。
语法格式
参数解释
默认监控: sar 1 1 // CPU和IOWAIT统计状态
(1) sar -b 1 1 // IO传送速率
(2) sar -B 1 1 // 页交换速率
(3) sar -c 1 1 // 进程创建的速率
(4) sar -d 1 1 // 块设备的活跃信息
(5) sar -n DEV 1 1 // 网路设备的状态信息
(6) sar -n SOCK 1 1 // SOCK的使用情况
(7) sar -n ALL 1 1 // 所有的网络状态信息
(8) sar -P ALL 1 1 // 每颗CPU的使用状态信息和IOWAIT统计状态
(9) sar -q 1 1 // 队列的长度(等待运行的进程数)和负载的状态
(10) sar -r 1 1 // 内存和swap空间使用情况
(11) sar -R 1 1 // 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)
(12) sar -u 1 1 // CPU的使用情况和IOWAIT信息(同默认监控)
(13) sar -v 1 1 // inode, file and other kernel tablesd的状态信息
(14) sar -w 1 1 // 每秒上下文交换的数目
(15) sar -W 1 1 // SWAP交换的统计信息(监控状态同iostat 的si so)
(16) sar -y 1 1 // TTY设备的活动状态
(17) 将结果输出到文件(-o)和读取记录信息(-f)
(18) sar -h // 查看帮助
栗子
CPU
数据解释和上面的/proc/stat一致。
主要看%iowait和%idle,%iowait过高表示存在I/O瓶颈,即磁盘IO无法满足业务需求,如果%idle过低表示CPU使用率比较严重,需要结合内存使用等情况判断CPU是否瓶颈。
查看当前CPU信息
sar 1 3 或 sar -u 1 3
# 每隔一秒刷新一次,刷新3次
查看所有CPU信息
sar -P ALL 1 3
查看今天到采样时间的CPU信息
sar -p 或 sar
进程长度和CPU load监控
sar -q 1 3
- runq-sz:等待运行的进程数
- plist-sz:进程和线程数
内存
查看内存信息
sar -r 1 3
- kbmemfree:和free命令中的free基本一致
- kbmemused:和free命令中的used+available基本一致
- %memused:kbmemused/total的百分比
- kbbuffers:就是free命令中的buffer
- kbcached:就是free命令中的cache
- kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)
- %commit:kbcommit/total的百分比
- kbactive:活动内存,通常不会被回收
- kbinact:非活动内存
- kbdirty:以KB为单位的内存量等待写入磁盘
查看swap信息
sar -W 1 3
查看内存分页信息
sar -B 1 3
- pgpgin/s:表示每秒从磁盘或swap置换到内存的字节数(KB)
- pgpgout/s:表示每秒从内存置换到磁盘或swap的字节数(KB)
- fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
- majflt/s:每秒钟产生的主缺页数.
- pgfree/s:每秒被放入空闲队列中的页个数
- pgscank/s:每秒被kswapd扫描的页个数
- pgscand/s:每秒直接被扫描的页个数
- pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
- %vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
I/O和磁盘
查看设备io情况
sar -b 1 3
查看磁盘io情况
sar -d 1 3 -p
# 如果不加-p,显示的设备名就是dev253-0,dev253-16
网络
查看主机上所有网卡信息
sar -n DEV 1 1
- IFACE:就是网络设备的名称;
- rxpck/s:每秒钟接收到的包数目
- txpck/s:每秒钟发送出去的包数目
- rxbyt/s:每秒钟接收到的字节数
- txbyt/s:每秒钟发送出去的字节数
- rxcmp/s:每秒钟接收到的压缩包数目
- txcmp/s:每秒钟发送出去的压缩包数目
- txmcst/s:每秒钟接收到的多播包的包数目
查看NFS信息
sar -n NFS 1 1 # 客户端
sar -n NFSD 1 1 # 服务端
其他
将结果输出到文件(-o)和读取记录信息(-f)
sar 1 1 -o test
sar -f test
读取以前文件中的数据
cd /var/log/sa
sar -f sa30
查看inode,文件和其他内核监控
sar -v 1 3
- dentunusd:目录高速缓存中未被使用的条目数量
- file-nr:文件句柄(file handle)的使用数量
- inode-nr:索引节点句柄(inode handle)的使用数量
- pty-nr:使用的pty数量
说明
要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来:
- 怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
- 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
- 怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看
tsar
官网地址:https://github.com/alibaba/tsar
是阿里巴巴开源的一个用来收集服务器系统和应用信息的采集报告工具,如收集服务器的系统信息(cpu,mem等),以及应用数据(nginx、haproxy等),收集到的数据存储在服务器磁盘上,可以随时查询历史信息。
安装
$ git clone https://github.com/alibaba/tsar.git
$ cd tsar
$ make
# make install
- 配置文件:/etc/tsar/tsar.conf
- 采集结果,/var/log/tsar.data
- 定时任务调用,/etc/cron.d/tsar,让系统每分钟调用tsar
- 文件轮转配置,/etc/logrotate.d/tsar,默认存储10年,保留120份
语法格式
栗子
指定1秒时间间隔查看系统信息,不指定的话默认是5分钟
tsar -li 1
查看内存,CPU,io,load
tsar --cpu/mem/io/load -li 1
查看cpu最近一分钟的监控数据
tsar --check --cpu
查看流量情况
tsar --traffic
tsar -D --traffic # 不做KMG转化
查看1天前的数据
tsar -n 1
查看具体日期的数据
tsar -d 20220630
查看指定CPU的util字段
tsar --cpu -s util
查看过去10分钟的tsar数据
tsar -w 10
查看vda磁盘io
tsar --io -I vda -li 1
查看网络重传率
tsar --tcp
iotop
显示实时的磁盘活动。iotop 监控 Linux 内核输出的 I/O 使用信息,并且显示一个系统中进程或线程的当前 I/O 使用情况。它显示每个进程/线程读写 I/O 带宽。它同样显示当等待换入和等待 I/O 的线程/进程花费的时间的百分比。
语法格式
参数解释
- -o:只显示有io操作的进程
- -b:批量显示,无交互,主要用作记录到文件。
- -n NUM:显示NUM次,主要用于非交互式模式。
- -d SEC:间隔SEC秒显示一次。
- -p PID:监控的进程pid。
- -u USER:监控的进程用户。
- -P:只显示进程,不显示线程。
- -k:以kb为单位显示
- -t:显示时间戳
快捷键
- 左右箭头:改变排序方式,默认是按IO排序。
- r:改变排序顺序。
- o:只显示有IO输出的进程。
- p:进程/线程的显示方式的切换。
- a:显示累积使用量。
- q:退出。
栗子
htop
是一个交互式的高级top,支持鼠标操作。
页面更直观,支持搜索过滤,可以显示子进程,kill进程不用输入pid。