简介
top 是 Linux 系统中的一个实时性能监测命令,相当于 Windows 系统中的任务管理器。它能动态地显示系统中各个进程的资源占用状况,包括 CPU 使用率、内存使用量等信息。
命令行选项与参数详解
Usage:
top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
-h:显示帮助信息。
-v:显示 top 的版本信息。
当 -h 和 -v 一起使用时(如 -hv),它们通常会一起显示帮助和版本信息,但这取决于 top 的具体实现。
-b:以批处理模式运行。通常与重定向或管道一起使用,以便将输出保存到文件或另一个命令中。
-c:显示完整的命令行(包括命令名和参数)。
-H:以线程模式显示进程。这将显示系统中的线程,而不仅仅是进程。
-i:忽略闲置和僵尸进程。
-O(注意是大写的“O”,而不是“o”):指定要显示或排除的字段。注意,这里可能是一个误写,因为通常 top 使用 -o(小写)来指定排序字段。
-s:在安全模式下运行,这将隐藏某些信息(如进程的所有者等)。但在标准的 top 命令中,并没有 -s 作为安全模式的选项。
-d secs:设置刷新间隔,单位为秒。默认是 5 秒。
-n max:设置 top 命令显示更新的次数。当达到这个次数后,top 会退出。
-u user:只显示指定用户的进程。
-U user:排除指定用户的进程。
-p pid(s):只显示指定进程 ID 的信息。可以指定多个 PID,用逗号分隔。
-o field:根据指定的字段对进程进行排序。例如,-o %CPU 会根据 CPU 使用率对进程进行排序。
-w [cols]:设置屏幕宽度。这会影响显示的列数。
性能监控报告输出解析
统计信息
top - 10:52:23 up 4 days, 14:20, 2 users, load average: 0.09, 0.06, 0.07
Tasks: 172 total, 1 running, 171 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.6 us, 0.5 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3817.1 total, 278.3 free, 1597.5 used, 2231.0 buff/cache
MiB Swap: 8192.0 total, 8192.0 free, 0.0 used. 2219.5 avail Mem
top - 10:17:54 up 12 days, 18:29, 1 user, load average: 2.02, 2.00, 1.83
10:17:54
系统当前时间。
up 12 days, 18:29
系统已经运行了12天18小时29分钟。
1 user
当前在线用户数。
load average: 2.02, 2.00, 1.83
系统过去1 分钟、5 分钟和 15 分钟的平均负载。关于 load average 的正常范围,这并没有一个固定的答案,因为它取决于你的系统配置、工作负载和期望的性能。但是,以下是一些一般的指导原则:
| 如果 load average 的值远低于你的 CPU 核心数(查看方法之一:cat /proc/cpuinfo | grep “processor” | wc -l),那么系统可能没有得到充分利用。 |
如果 load average 的值接近或略高于你的 CPU 核心数,那么系统可能正在高效运行。
如果 load average 的值持续高于你的 CPU 核心数很多倍,那么系统可能正在过载,并且可能需要更多的资源或优化来保持性能。
需要注意的是,load average 只是评估系统性能的一个指标,还需要结合其他工具(如 vmstat、iostat、htop 等)和观察来全面评估系统的状态。
Tasks: 407 total, 1 running, 406 sleeping, 0 stopped, 0 zombie
Tasks: 407 total
这表示系统中共有407个进程(或任务)。这些进程可以是运行中的程序、守护进程、系统进程等。
1 running
当前有1个进程正在CPU上运行。这通常意味着该进程正在占用CPU资源并执行其代码。需要注意的是,由于CPU的时间分片(time slicing)机制,一个进程可能只在短时间内占用CPU,然后让给其他进程。因此,即使有很多进程在运行,但在任何给定的瞬间,通常只有少数几个进程会真正在CPU上执行。
406 sleeping
大部分进程(在这个例子中是406个)都处于睡眠状态。这通常意味着这些进程当前没有被调度到CPU上执行,但它们在等待某个事件或资源(如I/O操作完成、用户输入、信号等)。一旦这些事件或资源变得可用,这些进程就会被唤醒并可能开始执行。
0 stopped
没有进程处于停止状态。停止状态通常是由于某种原因(如接收到SIGSTOP信号)而被强制暂停的进程。这些进程不会被调度到CPU上执行,直到它们被明确地恢复(如接收到SIGCONT信号)。
0 zombie
没有僵尸进程。僵尸进程是那些已经终止但父进程尚未获取其终止状态信息的进程。这些进程已经完成了它们的执行,但在系统中仍然占用了一些资源(如进程表条目)。通常,父进程会通过调用wait()或waitpid()系统调用来获取其僵尸子进程的终止状态信息,并释放这些资源。如果一个进程在终止后长时间保持僵尸状态,这可能是一个问题,因为这可能表示父进程存在问题或设计缺陷。
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 93.7 id, 6.2 wa, 0.0 hi, 0.0 si, 0.0 st
us (user): 0.1%
表示用户空间(user space)的 CPU 使用率。这包括了所有没有特权的进程所消耗的 CPU 时间。也就是说,这是应用程序(如数据库、Web 服务器等)消耗的 CPU 时间。
sy (system): 0.1%
表示内核空间(kernel space)的 CPU 使用率。这是操作系统内核(如调度程序、设备驱动程序等)消耗的 CPU 时间。
ni (nice): 0.0%
表示被改变过优先级的用户进程所使用的 CPU 时间。在 Linux 中,可以使用 nice 命令或 renice 命令来改变进程的优先级(nice 值)。一个正的 nice 值意味着较低的优先级,而一个负的 nice 值意味着较高的优先级。
id (idle): 93.7%
表示 CPU 空闲时间百分比。如果 id 的值很高(如本例中的 93.7%),那么 CPU 有大量的空闲时间,这通常意味着系统负载较低。
wa (iowait): 6.2%
表示 CPU 等待 I/O 操作完成的时间百分比。这通常是由于磁盘操作(如读写文件)或网络操作(如接收或发送数据)导致的。如果这个值很高,那么可能是磁盘或网络子系统成为了瓶颈。
hi (hardware interrupt): 0.0%
表示处理硬件中断所消耗的 CPU 时间百分比。硬件中断是由硬件设备(如键盘、鼠标、磁盘控制器等)产生的,操作系统需要处理这些中断以响应设备的请求。
si (software interrupt): 0.0%
表示处理软件中断(或称为软中断)所消耗的 CPU 时间百分比。软件中断通常是由内核或用户空间进程产生的,用于通知系统某个事件已经发生(如定时器到期)。
st (steal time): 0.0%
表示这个 CPU 被其他虚拟机(在虚拟化环境中)使用的时间百分比。如果你在一个虚拟化环境中运行 top(如 VMWare、KVM、Xen 等),并且你的虚拟机配置了 CPU 分配策略,那么你的虚拟机可能会与其他虚拟机共享物理 CPU。在这种情况下,st 会显示你的虚拟机等待其他虚拟机释放 CPU 的时间百分比。
KiB Mem : 65550624 total, 62881860 free, 1436800 used, 1231964 buff/cache
KiB Mem
这表示我们正在查看的是以千字节(KiB,即1024字节)为单位的内存信息。
65550624 total
这意味着系统上总共有65,550,624 KiB(即约64GB)的内存。
62881860 free
这表示当前有62,881,860 KiB(即约61GB)的内存是空闲的,可以被新进程或现有进程使用,而不会被系统回收。
1436800 used
这表示有1,436,800 KiB(即约1.4GB)的内存当前被进程所使用,不能被其他进程立即使用,除非那些进程释放它们。
1231964 buff/cache
这部分内存被用作缓冲区(buffers)和缓存(cache)。缓冲区用于存储块设备(如硬盘)的读写数据,而缓存用于存储文件系统或应用程序的临时数据,以加速数据访问。当系统需要更多内存时,这些缓冲区和缓存中的大部分数据可以被回收以供其他进程使用,因此它们通常不被视为“已使用”的内存。
KiB Swap: 32899068 total, 32899068 free, 0 used. 63511896 avail Mem
KiB Swap: 32899068 total
这表示你的系统配置了总共32,899,068 KiB(约32GB)的交换空间。交换空间是硬盘上的一个区域,当物理内存(RAM)不足时,系统会将一部分数据从RAM移动到交换空间,以释放RAM供其他进程使用。
32899068 free
这表示当前有32,899,068 KiB(约32GB)的交换空间是空闲的,即没有被使用。
0 used
这表示当前没有使用任何交换空间。这通常是一个好的迹象,因为它表明你的系统有足够的物理内存来处理当前的负载,而不需要依赖交换空间。
63511896 avail Mem
这个数值表示估算的可用于启动新应用的内存,但不包括交换空间。这个值是通过计算free、buffers和cached的总和并减去一个估算值(这个估算值表示需要保留的缓存和缓冲区数量以确保系统性能)来得到的。这个值通常比简单的free + buffers + cached的总和要小一些,因为它考虑了系统需要保留一些缓存和缓冲区以维持性能。
进程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
34961 999 20 0 2836672 431708 35584 S 2.0 11.0 26:58.62 mysqld
45275 lijianh+ 20 0 10668 6528 4352 R 1.0 0.2 0:10.05 top
761 root 20 0 2023008 50036 32564 S 0.3 1.3 19:34.09 containerd
34942 root 20 0 1238196 14552 10240 S 0.3 0.4 0:48.98 containerd-shim
35758 999 20 0 45184 5040 3584 S 0.3 0.1 8:34.02 redis-server
40285 root 20 0 2834836 456148 27972 S 0.3 11.7 12:18.46 java
44607 root 20 0 0 0 0 I 0.3 0.0 0:01.30 kworker/u10:1-events_power_efficient
PID:
这是进程标识符(Process ID),每个运行中的进程都有一个唯一的PID。在这里,PID是 41858。
USER
这是运行进程的用户名。在这个例子中,进程是由 root 用户运行的。
PR 和 NI
PR (Priority) 是进程的优先级。它决定了操作系统调度CPU给进程的顺序。这个值通常是基于NI(Nice值)和其他因素计算的。
NI (Nice值) 是一个可修改的优先级调整值。一个更高的Nice值意味着更低的优先级。这里,Nice值为 0,这是默认值。
VIRT
这是进程使用的虚拟内存总量,包括它使用的库、已加载的程序文本、数据段和栈的大小。在这里,6242304 KiB(或约6GB)的虚拟内存被该进程使用。
RES
这是进程当前使用的、驻留在物理内存中的内存大小(也称为常驻集大小或RSS)。在这里,303064 KiB(或约300MB)的物理内存被该进程占用。
SHR
这是共享内存的大小,即该进程和其他进程共享的内存量。在这里,13940 KiB(或约14MB)的内存是共享的。
S
这是进程的状态。S 表示进程处于睡眠状态(sleeping),这意味着它正在等待某个条件(如I/O操作)发生。
%CPU
这是自进程启动以来,它占用的CPU时间的百分比。在这里,4.3 表示该进程目前占用了大约4.3%的CPU时间。
%MEM
这是进程使用的物理内存占总物理内存的百分比。在这里,0.5 表示该进程使用了约0.5%的总物理内存。
TIME+
这是进程自启动以来使用的CPU时间的累积值。在这里,0:07.70 表示该进程已经运行了7.7秒(或0分7秒70百分之一秒)。
COMMAND:
这是启动进程的命令名。在这里,命令是 java,这意味着该进程是一个Java应用或JVM实例。
从这些信息中,我们可以看到这个Java进程正在使用大量的虚拟内存(6GB),但只使用了相对较少的物理内存(300MB)和CPU时间(4.3%)。