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

 

posted @ 2025-07-16 15:07  ShineLe  阅读(65)  评论(0)    收藏  举报