一、vmstat
1、简介
vmstat命令是一个查看虚拟内存的使用状况的工具,属于sysstat包。查看给定时间间隔的服务器的状态值,包括CPU使用率,内存、虚拟交换内存使用情况以及I/O读写情况;
2、使用
一般使用两个参数,第一个3表示每隔三秒采集一次服务器状态,第二个2表示总共采集两次;
[root@localhost ~]# vmstat 3 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 649216 161008 40 253496 0 1 21 2 46 13 0 0 100 0 0
0 0 649216 160984 40 253496 0 0 0 0 323 600 0 0 100 0 0
3、字段含义
1、procs(进程)
- r:就绪队列的长度,也就是正在运行或者等待的CPU进程数,当该指标值大于CPU数时,说明出现CPU瓶颈;
查看CPU核心数命令:cat /proc/cpuinfo|grep processor|wc -l
- b:等待IO的进程数量(不可中断睡眠状态的进程数);
2、memory(内存)
- swpd:使用虚拟内存的大小;若大于0,表示机器的物理内存不足(内存泄露或者物理内存不足以支持现在的程序)
- free:空闲内存的大小;
- buff:已经使用buff的大小,对块设备的读写进行缓冲;
- cache:已经使用的cache大小,文件系统的cache
3、swap
- si:每秒从交换区写到内存的大小,由磁盘到内存
- so:每秒从内存写入交换区的大小,由内存到磁盘
内存够用时,这两个值都为0,若这两值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
4、IO
- bi:每秒读取的块数(读磁盘),单位block
- bo:每秒写入的块数(写磁盘),单位block
5、system
- in:每秒中断数,包括时钟中断
- cs:每秒上下问切换数
这两个值越大,内核消耗的CPU时间sy会越大
6、CPU
- us:用户进程消耗的CPU时间;该值较高,说明用户进程消耗时间多,如果长时间超过50%,需要考虑优化程序算法;
- sy:系统进程消耗的CPU时间;该值较高,说明系统内核消耗CPU资源过多,若us+sy>80%说明可能存在CPU不足;
- Id:CPU空闲时间,包括IO等待时间;一般us+sy+id=100;
- wa:等待IO时间;该值过高,说明io等待比较严重,可能是由于磁盘大量随机访问造成的,也可能是磁盘出现瓶颈;
二、top
top,ps,pidstat等工具都可以查看CPU的使用率
top默认使用3s时间间隔,ps使用的是进程的整个声明周期
top显示系统总体CPU和内存的使用情况,以及各个进程的资源使用情况
ps只显示每个进程的资源使用情况;
[root@localhost ~]# top
top - 19:06:11 up 2 days, 4:09, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 277 total, 1 running, 259 sleeping, 17 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995704 total, 115844 free, 608648 used, 271212 buff/cache
KiB Swap: 2097148 total, 1428988 free, 668160 used. 219420 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2146 root 20 0 4151620 135696 24988 S 1.0 13.6 6:39.54 gnome-shell
1139 root 20 0 922376 5792 408 S 0.7 0.6 34:55.88 containerd
1620 mysql 20 0 1993692 0 0 S 0.7 0.0 34:01.34 mysqld
2441 root 20 0 608644 2532 828 S 0.3 0.3 7:55.07 vmtoolsd
字段解析
- 第一行:当前时间,运行时间,登录终端数,系统负载(1分钟、5分钟、15分钟的平均负载);
- 第二行:总进程数发、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数;
- 第三行:用户占用CPU的时间、系统内核占用CPU的时间、改变过优先级进程占用CPU的时间、CPU空闲时间、IO等待时间、硬中断时间、软中时间;
- 第四行:总物理内存、空闲内存、已使用内存、内核缓存的内存;
- 第五行:总虚拟内存、空闲虚拟内存、已使用虚拟内存、缓冲的交换区总量
- 后面是各个进程的详细信息
- PID:进程ID
- USER:进程所有者
- PR:进程优先级(内核)
- NI:nice值,表示用户层面优先级,NI=PR-20,-20到19,值越大,优先级越低
- VIRT:进程使用的虚拟内存大小
- RES:进程使用物理内存大小
- SHR:共享内存大小
- S:进程状态,D,不可中断;R,运行;S,睡眠;T,跟踪/停止;Z,僵尸进程
- %CPU:进程使用CPU总量
- %MEM:进程使用物理内总量
- TIME+:进程使用CPU时间总计
- COMMAND:命令名
常用参数
- -i<时间>:设置刷新使时间
- -n<次数>:循环显示次数
- -p<进程号>:指定进程
- -u<用户名>:指定用户
交互命令 - 1:展开多核CPU显示
- P:根据CPU使用率排序(默认)
- M:根据内存使用大小排序
- T:根据时间/累计时间进行排序
- m:切换显示内存信息
- t:切换显示命令和CPU状态信息
- q:退出
三、pidstat
pidstat是sysstat工具的一个而命令,用于监控进程CPU、内存、线程、设备IO等系统资源占用情况。首次显示从系统启动的各项统计信息,之后显示的是上次执行pidstat到此次的统计信息。
[root@localhost ~]# pidstat --help
用法: pidstat [ 选项 ] [ <时间间隔> [ <次数> ] ]
Options are:
[ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ] [ -t ] [ -U [ <username> ] ] [ -u ]
[ -V ] [ -w ] [ -C <command> ] [ -p { <pid> [,...] | SELF | ALL } ]
[ -T { TASK | CHILD | ALL } ]
常用参数
- -u:默认参数,显示各个进程的CPU统计情况
- -r:显示各个进程的内存使用情况
- -d:显示各个进程的IO使用情况
- -p:指定进程号
- -w:显示每个进程的上下问切换情况;
- -t:显示选项任务的线程的统计信息外的额外信息
1、所有进程CPU使用情况
[root@localhost ~]# pidstat
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 2021年03月25日 _x86_64_ (8 CPU)
11时14分53秒 UID PID %usr %system %guest %CPU CPU Command
11时14分53秒 0 1 0.00 0.01 0.00 0.01 3 systemd
11时14分53秒 0 2 0.00 0.00 0.00 0.00 5 kthreadd
11时14分53秒 0 6 0.00 0.00 0.00 0.00 0 ksoftirqd/0
11时14分53秒 0 7 0.00 0.01 0.00 0.01 0 migration/0
......
- PID:进程ID
- %usr:进程在用户空间占用CPU的百分比
- %system:进程在内核空间占用CPU的百分比
- %guest:进程在虚拟机占用的CPU百分比
- %CPU:进程占用CPU的百分比
- CPU:处理进程的CPU编号
- Command:当前进程对应的命令
2、内存使用情况(-r)
[root@localhost ~]# pidstat -r
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 2021年03月25日 _x86_64_ (8 CPU)
11时20分32秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
11时20分32秒 0 1 0.23 0.01 193924 3948 0.40 systemd
11时20分32秒 0 562 0.10 0.01 37476 1720 0.17 systemd-journal
11时20分32秒 0 585 0.01 0.00 192932 1404 0.14 lvmetad
11时20分32秒 0 604 0.03 0.00 50496 480 0.05 systemd-udevd
11时20分32秒 0 779 0.00 0.00 55532 240 0.02 auditd
11时20分32秒 0 781 0.00 0.00 84556 204 0.02 audispd
......
- Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
- Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
- VSZ:虚拟地址大小,虚拟内存的使用KB
- RSS:常驻集合大小,非交换区五里内存使用KB
3、进程IO使用情况(-d)
[root@localhost ~]# pidstat -d
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 2021年03月25日 _x86_64_ (8 CPU)
11时27分38秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
11时27分38秒 0 1 14.50 0.45 0.09 systemd
11时27分38秒 0 65 0.00 0.00 0.00 kswapd0
11时27分38秒 0 467 0.04 0.00 0.00 xfsaild/dm-0
11时27分38秒 0 562 0.09 0.00 0.00 systemd-journal
11时27分38秒 0 585 0.00 0.00 0.00 lvmetad
......
- kB_rd/s:每秒从磁盘读取的KB
- kB_wr/s:每秒写入磁盘KB
- kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
4、进程上下文切换情况(-w)
[root@localhost ~]# pidstat -w -p 467
Linux 3.10.0-1160.11.1.el7.x86_64 (localhost.localdomain) 2021年03月25日 _x86_64_ (8 CPU)
11时29分45秒 UID PID cswch/s nvcswch/s Command
11时29分45秒 0 467 19.86 0.00 xfsaild/dm-0
- Cswch/s:每秒主动任务上下文切换数量
- Nvcswch/s:每秒被动任务上下文切换数量
四、pref
perf是一个用来进行软件性能分析的工具;它可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题;
Linux性能计数器是一个新的基于内核的子系统,他提供一个性能分析框架,包括硬件(CPU,PMU(Performance Monitoring Unit))功能和软件(软件计数器、trace point)功能。
可以通过一下命令安装perf工具
sudo apt update
sudo apt install linux-tools-common linux-tools-generic linux-tools-`uname -r`
perf常用的5 个命令
- perf list:查看当前硬件环境支持的性能事件;
- perf stat:分析指定程序的性能状况;
- perf top:实时显示系统/进程的性能统计信息;
- perf record:记录一段时间内系统/进程的性能时间;
- perf report:读取perf record记录的perf.data文件,并显示分析数据;
perf stat
[root@localhost ~]# perf stat ls
anaconda-ks.cfg docker initial-setup-ks.cfg pw_txt useradd.sh www 模板 图片 下载 桌面
conf dump.rdb logs test user_add.txt 公共 视频 文档 音乐
Performance counter stats for 'ls':
7.31 msec task-clock # 0.057 CPUs utilized
3 context-switches # 0.410 K/sec
0 cpu-migrations # 0.000 K/sec
318 page-faults # 0.043 M/sec
<not supported> cycles
<not supported> instructions
<not supported> branches
<not supported> branch-misses
0.127432225 seconds time elapsed
0.000000000 seconds user
0.008797000 seconds sys
- 1、tesk-clock:任务真正占用处理器的时间,单位ms;
- 2、context-switches:上下文切换次数;
- 3、CPU-migrations:处理器迁移次数;为了维持多个处理器负载均衡,在特定条件下会将一个任务冲=从一个CPU迁移到另一个CPU;
- 4、page-faults:缺页异常次数。当前请求的页面尚未建立里、请求页面不在内存中,或物理地址和虚拟地址的映射关系尚未建立时,都会出发一次缺页异常。
- 5、cycles:消耗的处理器周期数;
- 6、instructions:执行了多少条指令;
- 7、branches:遇到的分支指令数;
- 8、branche-misses;预测错误的分支指令数;
perf top
常用参数:
- -e:指定要分析的性能事件;
- -p:分析目标进程以及其创建的的线程;
- -k
:待符号表的内核映像所在的路径 - -K:不显示属于内核或模块的符号;
- -U:不显示属于用户态程序的符号;
- -d:刷新界面的周期,默认为2s;
- -g:得到函数的调用关系图(一般都加此参数);
下面是指定进程的性能统计信息
[root@localhost ~]# perf top -g -p 1620 -d 5
Samples: 29 of event 'cpu-clock', 4000 Hz, Event count (approx.): 6875000 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
27.27% [kernel] [k] finish_task_switch
7.27% [kernel] [k] unroll_tree_refs
7.27% mysqld [.] pfs_start_mutex_wait_v1
6.36% [kernel] [k] clockid_to_kclock
3.64% [kernel] [k] __schedule
......
- 第一列overhead:表示性能事件在所有采用中的比例;
- 第二列Shared:该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等;
- 第三列Object:动态共享对象的类型。[.]表示用户空间可执行程序或动态链接库,[k]表示内核空间;
- 第四列Symbol:表示符号名,也就是函数名,当函数名未知时,用十六进制地址表示。
perf record
perf top只是实时显示,而perf record可以收集一段时间内性能信息到文件perf.data,之后可以perf report命令查看分析
[root@localhost ~]# perf record #ctrl+c结束采样
命令参数:
- -p :指定待分析进程的 pid(可以是多个,用,分隔列表)
- -t :指定待分析线程的 tid(可以是多个,用,分隔列表)
- -u :指定收集的用户数据,uid为名称或数字
- -a:从所有 CPU 收集系统数据
- -g:开启 call-graph (stack chain/backtrace) 记录(一般都要加此参数)
- -C :只统计指定 CPU 列表的数据,如:0,1,3或1-2
- -r :perf 程序以SCHED_FIFO实时优先级RT priority运
- 这里填入的数值越大,进程优先级越高(即 nice 值越小)
- -c : 事件每发生 count 次采一次样
- -F :每秒采样 n 次
- -o <output.data>:指定输出文件output.data,默认输出到perf.data
perf report
显示分析之前perf record统计的性能信息;
[root@localhost ~]# perf report
Samples: 26K of event 'cpu-clock', Event count (approx.): 6556500000
Overhead Command Shared Object Symbol
99.40% swapper [kernel.kallsyms] [k] native_safe_halt
0.04% perf [kernel.kallsyms] [k] mem_cgroup_update_page_stat
0.04% pool [kernel.kallsyms] [k] mpt_put_msg_frame
0.03% pool libc-2.17.so [.] _int_malloc
0.03% swapper [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore
相关链接:
https://zhuanlan.zhihu.com/p/141694060?from_voters_page=true
https://segmentfault.com/a/1190000021465563