Linux:top指令
学习自:(99+ 封私信 / 81 条消息) TOP命令参数详解---10分钟学会top用法 - 知乎
0、常用
本节为top常用参数总结,初学者请从第一节开始看。
1)前五行
分别代表
①top-服务器启动至今的一些信息:当前时间、运行时间、当前用户、系统负载(1 5 15分钟内的平均值)
②Tasks:当前整体进程运行情况
③%CPU:当前各任务占用CPU百分比,总和为100%:
us:用户进程占用
sy:系统内核占用(资源调度之类的)
ni:优先级调整占用
id:空闲
wa:等待磁盘IO
④KiB Mem:当前各任务占用内存,单位默认为KiB(写在该行最前了),如果要切换单位可以按E:
total:内存总量
free:空闲内存
used:已用内存
buff/cache:缓存(比内存更接近CPU的一块存储)
⑤KiB Swap:Swap内存使用情况
total:Swap区总量
free:空闲Swap区
used:已用Swap区
avail Mem:预估可用内存
2)第7行:详细进程信息
PR:优先级,反映被调度的优先度,该值越小优先度越高
NI:NICE值,PR=NI+20
VIRT:VIRTUAL,虚拟内存,进程理论上可用的内存上限
RES:驻留内存,当前已使用的物理内存大小(不含Swap)
SHR:共享内存,是RES的一部分,RES-SHR为独占内存
S:进程状态:
R:Running
S:Sleeping,休眠等待某个事件,可主动被信号中断
D:Disk Sleeping,休眠等待某个事件,必须该事件完成后才会恢复
Z:Zombie,僵尸进程,进程已终止,但父进程还未回收其资源——PID仍存在
T:Stopped,收到了暂停信号SIGSTOP后暂停,可通过恢复信号SIGCONT恢复
t:Traced,被调试器跟踪
%CPU:进程CPU使用率,如果为多线程则为所有线程使用率之和(可通过H切换为多线程显示模式,不过一般不直接在整体top里边用,而是用top -H pid的形式专门显示某个进程的所有线程)
%MEM:进程物理内存占用系统总内存百分比
TIME+:进程累计使用CPU时间
COMMAND:启动进程的命令或程序(可通过c切换为完整指令模式)
3)常见用法
#指定刷新时间,每秒刷新一次:-d top -d 1 #刷新2次:-n top -n 2 #输出到文件(通常配合-n):-b #如果不限制-n,则会每3s打一次一直持续 top -n 1 -b > /tmp/log.txt #指定进程:-p或--pid top -p 21478 top -p $(pgrep nginx) #指定用户:-u user或-U UID top -u root top -U 1000 #精细到线程级(通常配合-p查看某个进程的线程):-H top -Hp 1000 #指定单位(默认KiB):-E top -E m top -E g #指定排序依据的字段:-o top -o %CPU
4)交互式命令
M、P、T:按MEM、CPU、TIME+进行排序
u:筛选出某个用户的进程信息
1:显示多核CPU每个核的情况
E:切换显示单位
H:精细到线程级别
k:终止进程
f:进入布局自定义模式
q:退出
1、说明
top指令可以提供一个不断更新的当前系统进程、负荷信息。
2、输出
输出内容可以分为两部分:
前五行:系统整体的统计信息
从第八行开始:具体进程信息
1)第一行
top - 16:20:38 up 12 days, 5:24, 2 users, load average: 0.04, 0.03, 0.05
说明:
top:当前时间
up:机器运行时间
users:当前登录用户数
load average:系统负载,即任务队列的平均长度。三个数值分别为 1 5 15分钟到现在的平均值
任务队列是指CPU正在处理、等待CPU处理的进程之和。
load average升高可能代表①系统正在进行CPU密集型计算;②由于I/O问题导致队列堵塞。
一个CPU在一个时间片内只能运行一个进程,CPU核数的多少直接影响该机器在同时间内能运行的进程数。正常情况下Load Average不超过这台机器的总核数就基本没啥问题。
2)第二行
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
说明
Tasks:当前进程总数(以下四类加起来)
running:正在运行的进程数
sleeping:正在休眠的进程数
stopped:停止的进程数
zombie:僵尸进程数
running越多,服务器压力越大。
3)第三行
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0si, 0.0 st
说明
各种任务占用的CPU百分比,它们的总和为100。
指标 |
含义(均为该任务项占用CPU百分比) |
例子 |
us | user,用户空间 |
shell程序、编译器、各种应用、WEB服务器、桌面应用。 以上这些应用如果不是处于idle状态,那么绝大多数时间都是处于用户态。 |
sy | system,内核空间 |
进程运行时的资源由Linux内核调度,该项反映了Linux用于资源调度的时间。 对于OS设计而言,消耗在内核态的时间应该越小越好。 实践中,有一种典型情况会使sy变大,那就是大量的IO操作,因此在调查IO相关问题时需要着重关注它。 |
ni | nice,用户空间中进程调整优先级 |
用户态进程具有优先级,通过nice值进行调整。 nice值调整会消耗CPU时间,如果系统中没有进程被调整过nice值,那么ni就为0。 |
id | idle,空闲CPU | |
wa | waiting,等待输入输出 |
由于磁盘IO的速度与CPU的处理速度不在一个量级,因此经常会出现CPU在启动磁盘读写操作后,需要等待读写操作结果返回的情况。 在此之前CPU只能处于空闲状态,Linux在计算系统平均负载时会把CPU等待IO操作时间也计入其中,因此当我们看到系统平均负载过高时,可以通过wa来判断系统性能瓶颈是不是由过多IO引发的。 |
hi | hardirq,硬中断 |
硬中断:硬盘、网卡等硬件设备给CPU发出的中断消息。 CPU收到中断消息后需要进行处理(消耗CPU时间)。 |
si | softirq,软中断 |
软中断:由程序发出的中断。 CPU同样也要处理。 |
st | steal time,仅用于虚拟机,被Host抢占的CPU |
4)第四行
KiB Mem : 1863012 total, 1286408 free, 216532 used, 360072 buff/cache
KiB:指明了该行数字的单位,均为KiB,即1024B。之所以不用KB,是因为KB有可能在表示1024还是1000上有混淆,而KiB特指210=1024B。
说明
total:物理内存总量
free:空闲内存量
used:已使用内存量
buff/cache:用作buffer/cache(缓存)的内存量。
5)第五行
KiB Swap: 5242876 total, 7999484 free, 0 used. 1468240 avail Mem
本行为交换区(Swap)内存的相关信息,Swap区是硬盘上划分出的一块特殊区域,也叫虚拟内存,但由于本质是硬盘,所以读写速度慢。
当内存不足时,内核会将不常用的内存数据“换出”到Swap中,避免程序崩溃,但频繁的换入换出会严重拖慢系统速度(因为CPU读写硬盘的速度远低于CPU读写内存的速度)。
说明
total:Swap区内存总量
free:空闲Swap区内存量
used:已使用Swap区内存量(从内存中交换到硬盘中的数据量)
avail Mem:预估可用内存,即内存free + 可回收的buff/cache + Swap free
第四行、第五行对比来看,可以用于判断系统内存是否充足,如果内存used过高且Swap used持续增长,通常说明内存资源紧张,需要排查内存占用过高的进程。
6)进程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 21829 root 20 0 0 0 0 S 0.7 0.6 129:53.91 java 22559 root 20 0 158920 5628 4268 S 0.3 9.2 139:42.81 java 22598 root 20 0 162112 2208 1540 S 0.3 0.1 0:04.68 fluentd
说明
指标 | 含义 | 说明 |
PID |
Process ID。 进程ID |
|
USER | 用户所属用户 | |
PR |
Priority。 进程优先级。 |
数值越小,优先级越高,越容易被CPU调度。 带RT标记的进程为“实时进程”,优先级通常高于普通进程。 |
NI |
Nice。 谦让值。 |
用于调整进程优先度的“谦让度”,简介影响PR值。 针对非实时进程,关系为PR=NI+20 |
VIRT |
Virtual Memory 虚拟内存使用量 |
虚拟内存:该进程理论上可以访问的内存范围。 包括: 1、进程实际使用的物理内存(RES) 2、未使用的Swap空间内存 3、共享库中未加载到物理内存中的部分 4、已被分配但未使用的内存(例如程序预留内存) |
RES |
Resident Set Size 驻留内存 |
进程当前使用的物理内存(RAM)大小(KiB),不含Swap。 说明: 1、仅计算实际加载到物理内存中的部分(不含未使用的虚拟内存); 2、包含和其他进程共享的内存(如共享库) |
SHR |
Shared Memory 共享内存 |
进程使用的共享内存大小(KiB)。 包括: 1、与其他进程共享的库(如系统动态链接库libc.so) 2、通过shm等机制创建的进程间共享内存。 SHR是Res的一部分,非共享内存(独占内存)=RES-SHR |
S |
Process State 进程状态 |
使用单个字母表示: R:Running,就绪、运行 S:Sleeping,休眠(等待某个事件,如IO) D:Disk Sleeping,深度休眠(不可被信号中断,通常为等待磁盘IO) Z:Zombie,僵尸进程(进程已终止,但父进程还未回收其资源——PID仍存在) T:Stopped,暂停(如收到了SIGSTOP信号,可以通过SIGCONT恢复) t:Traced,被调试器跟踪 |
%CPU | 进程CPU使用率 |
该进程在最近一次刷新(默认3s)内占用的CPU百分比(一个CPU最高为100%,n核系统上限为n×100%)。 若某进程为多线程,默认计算所有线程CPU使用率总和(可按H切换为显示单个线程)。 |
%MEM | 进程物理内存占系统总内存百分比 |
计算公式为:(RES/系统总物理内存)×100%。 反映了进程占用物理内存的比例。 |
TIME+ | 进程累计使用CPU时间(包括用户态、内核态) |
精确到0.01s。 |
COMMAND | 启动进程的命令或程序 |
默认显示命令的简化名称(如bash、nginx) 按c可以切换为完整命令行(包含参数,如nginx -c /etc/...) |
以上为默认情况下显示的一些比较重要的指标,还有一些隐藏参数(下图未加*前缀的部分,按f进入下图):
3、top命令使用
1)调整显示内容
通过f键可以编辑显示内容,按f后进入下图:
说明:
①白色高亮的%CPU代表进程信息是按照%CPU这一列来排序的,如果要修改排序列,可以先通过上下键移动到该指标,按s选中排序列(选中之后首行的sort field is xxx会发生变化),之后按q生效;
②如果要改变显示顺序,可以先通过上下键移动到该指标处,再按右键(键盘→键,不是鼠标右键),此时会将该指标整体高亮,之后按上下键就可以移动该指标的布局位置了,如果要退出排序模式,可以按左键(即←)。
③显示的列前带有星号(*),如果要控制该列是否显示,可以通过空格或d键来控制该列是否显示。
④按q退出布局设置模式,回到top显示页面。
⑤默认排序方式是降序,如果要改为升序,可以在回到显示页面后,按R进行逆序
2)参数
虽然单一个top默认输出的内容大多数情况下足以满足我们问题排查所需,但top也允许我们通过参数更加精细化地控制输出。
参数 |
含义 |
说明 |
1、基础显示控制 | ||
-d 秒数 |
指定刷新间隔(默认3s) |
每秒刷新1次 top -d 1 |
-b | 批处理模式(Batch Mode),用于将输出重定向到文件、脚本 |
将一次top结果输出到文件 top -b -n 1 > top.log |
-n 次数 | 指定刷新次数后退出 | |
-c | 显示完整的command,而非简化的命令 | 显示nginx -c /usr/nginx/cof/nginx.conf而非nginx |
-s | Secure Mode,安全模式,禁止使用交互式命令(如k终止进程),防止误操作。 | |
2、过滤(用户、进程) | ||
-u 用户 | 只显示指定用户的进程 |
仅显示root用户的进程 top -u root |
-p PID | 只显示指定PID的进程(可指定多个PID,用逗号分隔) |
显示PID为1、100、200的进程 top -p 1,100,200 top -p $(pgrep nginx) |
-U UID |
按照UID过滤进程(区别于-u,前者只接收用户名) 显示UID为1000的用户进程 |
显示UID为1000的用户进程 top -U 1000 |
--pid PID | 同-p |
显示所有的nginx进程 top --pid $(pgrep nginx |
-i | 不显示idle和zombie进程 | |
-1 | 显示所有CPU核心的使用率(将多核系统的%CPU列拆分为多个CPU列) | |
3、线程、内存相关 | ||
-H | 按线程级CPU使用率排序,用于定位具体哪个线程占用资源过高 | |
-S | 累积模式,显示进程及其所有子进程的累积CPU时间 | |
-E 单位 |
切换内存单位(默认KiB),可选的单位有k、m、g |
top -E m:以MB为单位显示内存 top -E g:以GB为单位 |
-o 字段 | 指定显示的内容按照哪个字段进行排序(降序) |
按照CPU使用率降序排序 top -o %CPU |
4、交互式命令(非参数,而是进入top之后使用) 以下大小写是明确的,比如在小写模式下按p,会生成一个unknown command |
||
M | 按内存使用率(%MEM)排序 | |
P | 按CPU使用率(%CPU)排序 | |
T | 按累积CPU时间(TIME+)排序 | |
1 | 同-1,显示多核CPU的每个核的情况 | |
u | 同-u,显示某个用户的用户进程 | |
E | 同-E,切换单位,默认是KB,按一下切换为MB,在按一下切换为GB | |
H | 同-H,切换进程/线程显示模式 | |
k | 终止进程 | 先按k进入kill交互,输入PID并回车,之后输入信号编号(如9为强制终止) |
f | 自定义显示字段 | 见前文 |
q | 退出top |
3)例子
①监控所有的nginx进程,每秒刷新一次
top -p $(pgrep nginx) -d 1
②显示某进程下的所有线程
top -H -p <PID>
③输出到文件:-b
每5s刷新一次,共刷新10次,输出到文件
top -b -n 10 -d 5 > top_stats.logs
④显示用户的所有进程,按内存使用率排序
top -u miduser -o %MEM