Linux 命令 - top

# top
top - 00:34:31 up 169 days,  6:05, 16 users,  load average: 0.01, 0.01, 0.00
Tasks:  97 total,   1 running,  96 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    126396k total,   123312k used,     3084k free,    40908k buffers
Swap:   369452k total,     5912k used,   363540k free,    18244k cached
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1993 root      20   0  8668 2584 2468 S    1  2.0 131:31.81 nmbd
15774 hw    20   0  2388 1116  876 R    1  0.9   0:00.08 top
1 root      20   0  1980  604  520 S    0  0.5   5:49.12 init

第一、二行:系统信息

top - 01:33:08 up 169 days,  7:03, 16 users,  load average: 0.07, 0.02, 0.00
  • 01:33:08

    当前时间 01:33:08

  • up 169 days, 7:03

    系统总运行时间: 169天7小时3分钟

  • 16 users

    当前登陆的用户数: 16

  • load average

第三行: CPU 信息

Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

点数字键1可以展开或合上多个CPU, 如下:

Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

各个参数值显示的都是百分比。

  • us -- User CPU time

    CPU花在未调整优先级的(not niced)用户进程的时间。The time the CPU has spent running users’ processes that are not niced.

    注: nice 命令: 调整程序运行的优先级(范围 -20 到 19,越大,优先级越高)

  • sy -- System CPU time

    CPU花在内核及其进程上的时间。The time the CPU has spent running the kernel and its processes.

  • ni -- Nice CPU time

    CPU花在调整过优先级的(niced)用户进程的时间。The time the CPU has spent running users’ proccess that have been niced.

  • wa -- iowait

    等待I/O结束的CPU时间。Amount of time the CPU has been waiting for I/O to complete.

  • hi -- Hardware IRQ

    CPU花在硬件中断的时间。The amount of time the CPU has been servicing hardware interrupts.

  • si -- Software Interrupts

    CPU花在软件中断的时间。The amount of time the CPU has been servicing software interrupts.

  • st -- Steal Time

    The amount of CPU ’stolen’ from this virtual machine by the hypervisor for other tasks (such as running another virtual machine).

第四行:内存信息

Mem:    126396k total,   123312k used,     3084k free,    40908k buffers
Swap:   369452k total,     5912k used,   363540k free,    18244k cached

显示物理内存与交换内存使用情况。

先详细了解下 free 命令:

tester@debian01:~$ free -m
             total       used       free     shared    buffers     cached
Mem:            60         56          3          0          3         35
-/+ buffers/cache:         17         42
Swap:          172          0        171

系统内存信息(单位为Mb)详解:

  • Mem(表示物理内存使用概况):

    • Mem: total = 60, 表示总共物理内存为 60M (其实是 64M 的内存, 单位转换造成误差) (total = used + free, 即: 60 = 56 + 3; 因为省略了小数位, 可能存在误差)

    • Mem: used = 56, 表示总共已经使用了 56M (这个数值是从内核的角度来看的. 也就是说, 所有 buffers 和 cached 所占用的内存也都被当作已经使用. 其实这些部分还是可以分给应用程序的)

    • Mem: free = 3, 表示目前空闲 3M. (同样, 这个数值是从内核的角度来看的. 也就是说, 所有 buffers 和 cached 所占用的内存也都被当作已经使用)

    • Mem: shared = 0, 表示应用程序的共享内存(这一块还不是很理解)

    • Mem: buffers = 2, 表示 buffers 缓冲使用了 2M (块设备的读写缓冲区)

    • Mem: cached = 35, 表示 cache 缓冲使用了 35M (文件系统的cache)

  • -/+ buffers/cache(表示如果将 buffers 和 cached 的内存看作可用的话, 内存使用情况):

    • -/+ buffers/cache: used = 17, 表示不考虑 buffers 和 cached 的内存, 系统实际使用了 17 M. (56 - 3 - 35, 误差来源于省略掉的小数位)

    • -/+ buffers/cache: free = 42, 表示不考虑 buffers 和 cached 的内存, 系统实际空闲了 42 M. (3 + 3 + 35, 误差来源于省略掉的小数位) (注: 这一组值很重要, 可以作为系统空闲情况的重要参考)

  • Swap(表示交换内存使用概况):

    • "total/used/free" 分别表示 "总共/已使用/空闲" 状况.

而 top 命令中的内存信息, 只是将 -/+ buffers/cache 省掉(其实我们可以自己算), 并将 cached 挪到了下一行而已.

各列名称及解释

  • PID

    进程ID(Process Id)

  • USER

    任务所有者(The effective user name of the task’s owner)

  • PR

    优先级(Priority)

  • NI

    友好度(Nice value)

    任务的友好度。负值表示高优先级,正值表示低优先级(范围 -20 到 19)。值为零则表示不会调整任务分配的优先级。[这样理解:值越大,越友好。越不会跟别人抢资源,越不优先。] The nice value of the task. A negative nice value means higher pri‐ority, whereas a positive nice value means lower priority. Zero in this field simply means priority will not be adjusted in determining a task’s dispatchability.

  • VIRT

    虚拟内存, 单位: Kb. [Virtual Image (kb)]。任务所占用的虚拟内存。包含了所有的代码、数据、共享库及交换页面。 The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out.

  • RES

    物理内存, 单位: Kb. [Resident size (kb)]。任务所占用的非交换物理内存。The non-swapped physical memory a task has used.

    注: 这一组内存信息最重要, %MEM 所显示的百分比就是由此列的值得出.

  • SHR

    共享内存, 单位: Kb. [Shared Mem size (kb)]。任务所占用的共享内存。它反映了可以与其他进程共享的内存的大小。The amount of shared memory used by a task. It simply reflects memory that could be potentially shared with other processes.

    • 关于 VIRT/RES/SHR 的详解区别:

      • VIRT:virtual memory usage

        1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等

        2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

      • RES:resident memory usage 常驻内存

        1、进程当前使用的内存大小,但不包括swap out

        2、包含其他进程的共享

        3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反

        4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

      • SHR:shared memory

        1、除了自身进程的共享内存,也包括其他进程的共享内存

        2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小

        3、计算某个进程所占的物理内存大小公式:RES – SHR

        4、swap out后,它将会降下来

      • DATA

        1、数据占用的内存。如果top没有显示,按f键可以显示出来。

        2、真正的该程序要求的数据空间,是真正在运行中要使用的。

      • 参考:http://blog.csdn.net/dingpeng1978/article/details/6559232

  • S

    进程状态 [Process Status]。状态值所对应的意义如下:

    • D = 不可中断的休眠 [uninterruptible sleep]

    • R = 运行 [running]

    • S = 休眠 [sleeping]

    • T = 回溯或停止 [traced or stopped]

    • Z = 僵尸 [zombie]

  • %CPU

    CPU 使用率 [CPU usage]

  • %MEM

    物理内存使用率 [Memory usage (RES)], 以 RES 列的值为标准.

  • TIME+

    CPU Time, hundredths (精确到1/100秒,如11:29.46=11分钟, 29.46秒)。任务开启后所占用的总的CPU时间。

  • COMMAND

    任务名称

常用参数

  • top -d 1

    每隔一秒刷新一次。(默认为3秒)

    在 top 运行过程中, 也可以通过输入 d 或 s 重新设置刷新值。Delay time interval as: -d ss.tt (seconds.tenths)

  • top -c

    对于COMMAND列,显示包含路径的命令行,而不只是程序名称。如: 不使用 -c 显示为 smbd, 加 -c 则为 /usr/sbin/smbd

    在 top 运行过程中可以通过输入 c 切换此状态。

  • top -S

    累计模式。累计模式开启,则每个进程的CPU时间(TIME+),表示它及它的关闭的子进程所用的时间。

    在top命令运行时,可以通过输入 S 切换累计模式状态。

交互命令

  • M

    按 %MEM 由高到低排列

  • N

    按 PID 由高到低排列

  • P

    按 %CPU 由高到低排列

  • T

    按 TIME+ 由高到低排列

  • s

    更改刷新频率,输入秒数。

  • d

    同 s 一样。

  • S

    开/关累计模式

  • c

    显示/不显示程序全路径 [参看 top -c]

  • i

    忽略闲置、僵死的进程

  • u

    输入用户名,只显示此用户的进程

  • H

    显示/不显示线程

  • 向后翻页

  • <

    向前翻页

  • q

    退出

  • f

    选择要显示的列。直接输入小写索引字母即可。点击任意其他键返回(如回车)。

    选中的会改为大写并加*号。如: * A: PID = Process Id

    未选中的(即不显示的), 状态为小写,如: a: PID = Process Id

  • o

    改变显示列的顺序,用法与上相同。输入大写索引字母,则会往前移动。输入小写索引字母,则会往后移动。

  • F

    选择排序的列。top 以此处选择的列为准排序。

  • O

    与 F 功能完全相同。

应用

  • 如何通过 shell 脚本监控 top 命令并抓取某几个进程的信息?

    在 shell 脚本中用如下一行即可:

      top -b -n 2 | grep -E "mysql| apache2" >> log
    

    参数 -b 用于输出 top 的信息, -n 2 表示两次刷新. 可以加 -d 10 更改刷新间隔时间. 也可以去掉 -n 2, 表示一直不停取结果.

  • 如何用 top 只监视某个进程的状态?

    用pstree -p 取得进程PID, 然后再监控。如:

      # pstree -p | grep apache2
      # top -p 2038,13734,13735
    
最近更新: 10/7/2018, 7:49:52 PM