我们在查看系统性能的时候,最常用的一个命令是 top 命令,top 命令内容还是很丰富的,根据所学所知梳理下。
一 Top 常用内容说明
直接输入 top 命令,查看下列内容:
第一行说明
top - 23:00:32 up 14 days, 5:43, 1 user, load average: 8.11, 3.92, 2.92
HH:mm:ss: 当前的系统时间。
up xxx days, HH:mm: 从本次开机到现在经过的时间。
x user: 当前有几个用户登录到该机器。
load average: 系统 1 分钟、5 分钟、15 分钟内的平均负载值。
需要注意下平均负载,这个概念还是比较复杂,简单的看就是系统中处于运行状态和不可中断状态的平均进程数,这个数字是高还是低不能看数值,要看和 cpu 数的关系,如果平均负载为 2,在 1 个 cpu 的系统中,则 50%的进程不能运行;在 2 个 cpu 系统中,刚好占满 cpu;在 4 个 cpu 的系统中,还空闲 50%的 cpu。
第二行说明
Tasks: 145 total, 1 running, 144 sleeping, 0 stopped, 0 zombie
显示总共 144 个进程,一个正在运行,143 个处于休眠状态,0 个处于 stoped 停止状态,还有 0 个 zombie 僵尸进程。
这行我一般关注下僵尸进程梳理会不会太多和总的进程数是不是太多。
第三行说明
%Cpu(s): 27.3 us, 24.2 sy, 0.0 ni, 43.9 id, 1.4 wa, 0.0 hi, 3.2 si, 0.0 st
us: 用户态 cpu 运行时间占比。
sy: 内核态 cpu 运行时间占比,程序进行系统调用的时候,程序需要进入内核态运行。
ni: 即 nice,是改变过 nice 的进程的 cpu 占用。
id: 即 idle ,即空闲 cpu 占用。
wa: 等待 IO 的 cpu 占用。
hi: 处理硬中断(hardware interrupt)的 CPU 时间占比。
si: 处理软中断(software interrupt)的 CPU 时间占比。
st: 代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
除了 idle,其他占用超过 50%,都可能存在 CPU 问题。
第四行和第五行
KiB Mem : 32739656 total, 16277748 free, 9690976 used, 6770932 buff/cache
KiB Swap: 16515068 total, 10828100 free, 5686968 used. 22504860 avail Mem
以物理内存为例。free 命令也会打印出类似的信息。total: 内存总量。
free: 空闲内存量。
used: 使用中的内存量。
buff/cache: 缓存和 page cache 占用的内存量。
其实这里面的 swap 还挺重要的,有时候内存还是够用,仍然占用了 swap,这可能或拖慢程序运行, 特别像一些 java 程序,比如 es,solr 等,最好把使用 swap 的偏好降低,尽量用内存,以提升性能。
剩下行
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6364 root 20 0 5743628 502224 4852 S 127.9 1.5 24422:42 java
3490 mysql 20 0 2827252 89604 3152 S 70.1 0.3 14378:17 mysqld
进程详细信息 这里显示的数据列是可以改的,默认会显示如图中的 12 列。其含义分别如下:PID: 进程 ID。
USER: 进程所有者的用户名。
PR: 从系统内核角度看的进程调度优先级。
NI: 进程的 nice 值,即从用户空间角度看的进程优先级。值越低,优先级越高。
VIRT: 进程申请使用的虚拟内存量。
RES: 进程使用的驻留内存(即未被 swap out 的内存)量。
SHR: 进程使用的共享内存量。
S: 进程状态。R=running,S=interruptible sleeping,D=uninterruptible sleeping,T=stopped,Z=zombie。
%CPU: 进程在一个更新周期内占用的 CPU 时间比例。
%MEM: 进程占用的物理内存比例。
TIME+: 进程创建后至今占用的 CPU 时间长度。
COMMAND: 运行进程使用的命令。
说明:除了需要关注 cpu 和内存这个关键因素外,还应该看下进程的状态,如果看到大量的 D 状态进程,需要关注下 IO 情况。
二 TOP 命令常用技巧
2.1 显示单个 cpu 的占用信息
在 top 运行界面输入 1,可以显示单个 cpu 的占用信息:
%Cpu0 : 28.9 us, 22.6 sy, 0.0 ni, 44.3 id, 0.3 wa, 0.0 hi, 3.8 si, 0.0 st
%Cpu1 : 27.6 us, 23.3 sy, 0.0 ni, 44.7 id, 1.5 wa, 0.0 hi, 2.9 si, 0.0 st
%Cpu2 : 28.5 us, 23.6 sy, 0.0 ni, 42.6 id, 1.8 wa, 0.0 hi, 3.5 si, 0.0 st
%Cpu3 : 26.7 us, 24.2 sy, 0.0 ni, 44.0 id, 2.2 wa, 0.0 hi, 2.9 si, 0.0 st
输入 2 可以按照 NUMA 架构,显示 Node 上的 cpu 占用信息。
2.2 按照 CPU 或内存占用排序
输入 M,按照内存使用排序:
5267 root 20 0 34.5g 3.3g 51308 S 0.0 10.7 46:44.77 java
5857 root 20 0 6097540 1.2g 7752 S 42.5 3.8 8450:16 java
6250 root 20 0 8052856 1.1g 7136 S 0.0 3.7 24:55.49 java
5602 root 20 0 5940940 782112 7072 S 0.0 2.4 37:52.07 java
5934 root 20 0 5734216 593924 8428 S 10.0 1.8 275:13.15 java
6364 root 20 0 5743628 502224 4852 S 127.5 1.5 24448:39 java
输入 P 对 cpu 使用率排序
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6364 root 20 0 5743628 502224 4852 S 129.0 1.5 24447:26 java
3490 mysql 20 0 2827252 89604 3152 S 70.0 0.3 14391:55 mysqld
5857 root 20 0 6097540 1.2g 7752 S 41.3 3.8 8449:52 java
5934 root 20 0 5734216 593924 8428 S 1.0 1.8 275:12.30 java
5044 root 20 0 10.7g 116684 5432 S 0.3 0.4 19:38.01 java
2.3 显示完整的命令
输入 c 显示完整的命令:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6364 root 20 0 5743628 502224 4852 S 127.7 1.5 24450:02 /usr/java/jdk1.8.0_191-amd64/bin/java -server -Xms512m -Xmx2048m -XX:NewSiz+
3490 mysql 20 0 2827252 89604 3152 S 71.0 0.3 14393:22 /usr/sbin/mysqld
5857 root 20 0 6097540 1.2g 7752 S 41.3 3.8 8450:43 java -Djava.awt.headless=true -Djava.library.path=/home/Spiderflow_beta/AUS+
如果命令太长看不到,可以通过方向键,向右来显示更少的列,更多的命令内容。
2.4 显示线程信息
输入 H 显示线程信息:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6522 root 20 0 5743628 502224 4852 S 62.1 1.5 11662:49 java
6523 root 20 0 5743628 502224 4852 R 62.1 1.5 11652:13 java
7101 root 20 0 6097540 1.2g 7752 S 40.5 3.8 8366:31 java
28930 mysql 20 0 2827252 89604 3152 S 14.3 0.3 104:55.77 mysq
2.5 显示特定进程信息
top -p pid1,pid2
显示:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6522 root 20 0 5743628 502224 4852 R 146.7 1.5 24455:13 java
7101 root 20 0 6097540 1.2g 7752 R 40.0 3.8 8452:23 java
2.6 查看帮助信息
其他命令,大家可以:输入 h 查看 top 命令帮助信息:
Help for Interactive Commands - procps-ng version 3.3.10
Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.
Z,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
l,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info
0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode
f,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width
L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right
R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify
c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify
x,y . Toggle highlights: 'x' sort field; 'y' running tasks
z,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria
n,#,^O . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)
C,... . Toggle scroll coordinates msg for: up,down,left,right,home,end
k,r Manipulate tasks: 'k' kill; 'r' renice
d or s Set update interval
W,Y Write configuration file 'W'; Inspect other output 'Y'
q Quit
( commands shown with '.' require a visible task display window )
Press 'h' or '?' for help with Windows,
三 诗词欣赏
新凉
[宋] 徐玑
水满田畴稻叶齐,日光穿树晓烟低。
黄莺也爱新凉好,飞过青山影里啼。