top命令整理
top命令查看进程的资源使用情况
参数 | 作用 | 案例 |
---|---|---|
N | 按照pid排序(PID一列从大到小) | |
P | 按照cpu利用率排序(%CPU一列从大到小) | |
M | 按照内存利用率排序(%MEM一列从大到小) | |
T | 进程使用cpu时间总计排序(TIME+一列从大到小) | |
1 | 数字1可以看到有几个cpu,每个cpu的使用情况 | |
c | 切换显示命令名称和完整命令行 | |
f | 查看top输出字段的含义 | |
m | 切换显示内存信息 | |
n | 输入数字,可以查看指定数量的进程,可以与 P/M/T 等混合使用,查看某项资源前几的进程 |
|
s/d | 改变两次刷新之间的延迟时间,默认为3秒,可以与 P/M/T 等混合使用,定时刷新查看进程情况 |
|
t | 切换显示进程和cpu状态信息 | |
u | 输入用户名只显示该用户的进程 | |
= | 任何时刻按等于号,可以查看最新的top显示 |
如果是指定查看某个进程资源利用情况 top -p ${pid1},${pid2},${pid3}
这样的命令来查询
top命令查询结果说明
以下是top命令的输出结果案例:
top - 14:29:58 up 31 days, 17:49, 2 users, load average: 0.04, 0.04, 0.05
Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7966152 total, 3206444 free, 399576 used, 4360132 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7202316 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29404 root 20 0 7080 6236 808 S 1.0 0.1 389:38.71 sap1002
首先是统计信息
第一行 top - 14:29:58 up 31 days, 17:49, 2 users, load average: 0.04, 0.04, 0.05
的说明如下:
-
14:29:58
表示当前时间,"时:分:秒" -
up 31 days, 17:49
表示系统运行时间,"31天17时49分" -
2 users
表示目前登录机器的用户数,"2个用户登录了机器" -
load average: 0.04, 0.04, 0.05
表示1min、5min、15min到现在的系统平均负载
第二行 Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie
的说明如下:
-
149 total
表示共有149个进程 -
1 running
表示1个进程在运行 -
148 sleeping
表示148个进程在睡眠状态 -
0 stopped
表示停止的进程数为0 -
0 zombie
表示僵死的进程数为0
第三行 %Cpu(s): 0.5 us, 0.2 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
的说明如下:
-
0.5 us
表示用户空间占用cpu百分比 -
0.2 sy
表示内核空间占用cpu百分比 -
0.0 ni
表示用户进程空间内带有优先级的进程占用cpu百分比 -
99.3 id
表示空闲cpu百分比 -
0.0 wa
表示等待输入输出cpu时间百分比 -
0.0 hi
表示硬中断(Hardware IRQ)占用cpu的百分比 -
0.0 si
表示软中断(Software Interrupts)占用cpu的百分比 -
0.0 st
表示有虚拟cpu的情况,被虚拟机偷掉的cpu时间百分比
第四行 KiB Mem : 7966152 total, 3206444 free, 399576 used, 4360132 buff/cache
的说明如下:
-
7966152 total
表示物理内存总量 -
3206444 free
表示空闲内存总量 -
399576 used
表示使用的物理内存总量 -
4360132 buff/cache
表示内核缓存的内存量
第五行 KiB Swap: 0 total, 0 free, 0 used. 7202316 avail Mem
的说明如下:
-
0 total
表示交换区总量 -
0 free
表示空闲交换区总量 -
0 used
表示使用的交换区总量 -
7202316 avail Mem
表示可用于进程下一次分配的物理内存数量
计算可用内存可以用公式: Mem_free + Mem_buff/cache
然后是各个进程的使用情况
字段名 | 字段含义 | 案例 |
---|---|---|
PID | 进程ID | 29404 |
USER | 进程所有者 | root |
PR | 进程的优先级别,越小越优先被执行 | 20 |
NI | nice值: 负值表示高优先级; 正值表示低优先级 |
0 |
VIRT | 进程占用的虚拟内存(kb) | 7080 |
RES | 进程占用的物理内存(kb) | 6236 |
SHR | 进程占用的共享内存(kb) | 808 |
S | 进程的状态: S表示休眠; R表示正在运行; Z表示僵死; N表示该进程优先值为负 |
S |
%CPU | 进程占用CPU的比例 | 1.0 |
%MEM | 进程占用物理内存的比例 | 0.1 |
TIME+ | 进程启动后,占用CPU的累加时间,与进程启动时间不同 | 389:38.71表示389分38.71秒 |
COMMAND | 进程启动命令名称 | sap1002 |
iostat
查看磁盘io使用情况,可以使用命令 iostat -x 1
表示每隔1秒查询机器的io利用率情况
iostat查看结果
使用 iostat -x
查看详情的结果如下
Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm) 05/22/2020 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.59 0.00 0.32 0.05 0.00 99.04
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 2.82 0.01 1.97 0.11 46.25 46.90 0.01 3.01 6.16 3.00 0.82 0.16
vdb 0.00 0.91 0.00 0.62 0.01 8.64 27.90 0.00 3.86 0.82 3.87 1.74 0.11
scd0 0.00 0.00 0.00 0.00 0.02 0.00 64.16 0.00 0.30 0.30 0.00 0.26 0.00
关于cpu的使用说明如下
-
%user
表示用户空间占用cpu百分比 -
%nice
表示用户进程空间内带有优先级的进程占用cpu百分比 -
%system
表示内核空间占用cpu百分比 -
%iowait
表示等待输入输出cpu时间百分比 -
%steal
表示有虚拟cpu的情况,被虚拟机偷掉的cpu时间百分比 -
%idle
表示空闲cpu百分比
关于设备利用率的使用说明如下
-
rrqm/s
表示每秒合并到设备的读取请求数 -
wrqm/s
表示每秒合并到设备的写入请求数 -
r/s
表示每秒向磁盘发起的读操作数 -
w/s
表示每秒向磁盘发起的写操作数 -
rkB/s
表示每秒从磁盘读取数据大小,单位 KB/s -
wkB/s
表示每秒向磁盘写入数据大小,单位 KB/s -
avgrq-sz
表示平均每次设备io操作的数据量大小 -
avgqu-sz
表示平均io队列长度 -
await
表示平均每次设备io操作的等待时间(毫秒),一般的,系统io响应时间低于5ms,如果大于10ms就比较大了 -
r_await
表示每个读操作平均所需要的时间(毫秒),不仅包括硬盘设备读操作时间,还包括在kernel队列中等待时间 -
w_await
表示每个写操作平均所需要的时间(毫秒),不仅包括硬盘设备写操作时间,还包括在kernel队列中等待时间 -
svctm
表示平均每次设备io操作的服务时间(毫秒),数据不可信! -
%util
表示一秒钟有多少时间用于io操作,即被io消耗的cpu百分比,一般的如果该参数是100%表示设备已经接近满负荷运行
另外我们也可以直接使用 iostat
命令查看,输出结果案例如下:
Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm) 05/22/2020 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.59 0.00 0.32 0.05 0.00 99.04
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.98 0.11 46.25 313948 127061392
vdb 0.62 0.01 8.65 29153 23756052
scd0 0.00 0.02 0.00 42058 0
关于设备利用率的使用说明如下
-
Device
表示磁盘名称 -
tps
表示每秒IO数(即IOPS,磁盘每秒读写次数之和) -
kB_read/s
表示每秒从磁盘读取数据大小,单位 KB/s -
kB_wrtn/s
表示每秒向磁盘写入数据大小,单位 KB/s -
kB_read
表示从磁盘读取的数据总量,单位 KB -
kB_wrtn
表示向磁盘写入的数据总量,单位 KB
iotop
iotop命令查看io利用最高的进程,使用 iotop -oP
命令,-o
表示只显示有io消耗的进程,-P
表示只显示进程,iostat默认是显示所有线程。查看到如下的案例结果:
Total DISK READ : 135.42 K/s | Total DISK WRITE : 73.87 K/s
5.582 KDISK READ: 135.42 K/s | Actual DISK WRITE: 0.00 B/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
9016 be/4 test1 67.71 K/s 16.41 K/s 0.00 % 0.31 % nginx: worker process
9018 be/4 test1 67.71 K/s 18.47 K/s 0.00 % 0.10 % nginx: worker process
9015 be/4 test1 0.00 B/s 12.31 K/s 0.00 % 0.00 % nginx: worker process
9019 be/4 test1 0.00 B/s 4.10 K/s 0.00 % 0.00 % nginx: worker process
9017 be/4 test1 0.00 B/s 2.05 K/s 0.00 % 0.00 % nginx: worker process
如果是想要显示累计的io消耗可以使用命令 iotop -oPa
pidstat
pidstat用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等,使用 pidstat -d 1
命令,每隔一秒进行查看统计信息,例如如下的案例结果:
Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm) 05/23/2020 _x86_64_ (4 CPU)
09:54:17 AM UID PID %usr %system %guest %CPU CPU Command
09:54:17 AM 0 1 0.00 0.01 0.00 0.01 1 systemd
当pidstat -r -p 29461 2 1
输出内存字段信息的时候,内容如下:
Linux 3.10.107-1-linux2_cvm_guest-0051 (test-cvm) 05/23/2020 _x86_64_ (4 CPU)
10:13:03 AM UID PID minflt/s majflt/s VSZ RSS %MEM Command
10:13:05 AM 30000 29461 0.00 0.00 45848 1820 0.02 nginx
针对上面输出的字段解释:
-
minflt/s
: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数 -
majflt/s
: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
pidstat [option] [${采样周期}] [${采样次数}]
表示按照一定的采样周期执行一定的采样次数的该命令,例如 pidstat 2 5
表示每2秒执行一次该命令,一共执行5次。
常用的参数如下:
-
-u
表示输出cpu使用情况,与直接使用pidstat
结果一样 -
-r
表示输出内存使用情况 -
-d
表示输出io使用情况 -
-p
表示指定特定的进程pid的使用情况 -
-h
表示将输出结果在一行中展示,例如如果想要将-u -r -d
都输出的情况,并且放在一行中显示便于导出数据 -
-t
表示列出线程的统计信息
例如pidstat -r -p 29461 1
表示每隔一秒输出进程pid为29461的内存使用情况
ps
ps命令用于查看进程的瞬间资源使用情况,运行时间,使用cpu的时间等等信息都可以查看到,常用的命令如下
ps -eo pid,tty,user,comm,lstart,etime | grep redis
通过 -o
来输出指定的字段信息,-e
表示输出所有的进程,其中一些输出字段的说明如下:
-
pid
表示进程PID -
tty
表示终端号 -
user
表示创建进程的用户名 -
comm
表示进程命令 -
lstart
表示进程启动的时间点 -
etime
表示进程运行时间,格式为 dd-hh:mm:ss
ps -aux
用BSD的格式来显示进程,显示的项目有
-
USER
表示创建进程的用户名 -
%CPU
表示进程占用cpu的百分比 -
%MEM
表示进程占用内存的百分比 -
VSZ
表示进程使用虚拟内存(单位为KB) -
RSZ
表示进程使用物理内存(单位为KB) -
STAT
表示进程的状态 -
START
表示进程的启动时间点 -
TIME
表示进程占用cpu的时间
ps -ef
用于标准的格式输出,显示的项目有
-
UID
表示创建进程的用户名 -
PID
表示进程PID -
PPID
表示该进程的父进程的PID -
C
表示cpu使用利用率,是%CPU
的整数部分 -
STIME
表示进程启动的时间点 -
TTY
表示终端号 -
TIME
表示进程占用cpu的时间 -
CMD
表示进程命令
重要说明:
ps
和vmstat
获取到的cpu利用率都是不准的,所以如果想要查看进程占用cpu的使用情况,还是得使用top
命令。
ps
看到的cpu利用率是自进程运行以来累计的cpu占用率。
ps|vmstat|top
这三者查看到的cpu利用率的大致关系如下:vmstat
的100%-idle == ps的cpu占用率/cpu核心数 == top的cpu占用率/cpu核心数/物理cpu数目
但是要想确认cpu的具体使用情况,还是得看top。另外内存的使用ps和top的查看结果是一致的
cpu核数计算
cpu总核数 = 物理cpu数目 * 每颗物理cpu的核数
总逻辑cpu数 = 物理cpu数 * 每颗物理cpu的核数 * 超线程数
如何查看物理cpu数目
cat /proc/cpuinfo | grep 'physical id' | sort | uniq
如何查看每颗物理cpu的核数
cat /proc/cpuinfo | grep 'cpu cores' | sort | uniq
如何查看总逻辑cpu数
cat /proc/cpuinfo | grep 'processor'
如何查看cpu型号
cat /proc/cpuinfo | grep 'name'
如何查看每个逻辑cpu的所在物理cpu的id和核id
cat /proc/cpuinfo | egrep 'physical id|core id'