首页 » top - 查看进程

top工具的使用

top用于查看系统进程:

Linux top

top命令行参数

-b
批处理模式(batch mode),可输出到管道、文件。默认情况下-b会一直输出,可以用-nN指定输出次数。
-n N
限制输出次数。
-d N
刷新时间间隔。
-p PID
监控指定进程。

进入top界面后的操作

按键说明
c 显示完整的命令名。c为Command之意。
d 修改刷新时间。d为Display之意。
u 显示指定用户相关进程。u为User之意。
P 按CPU使用排序。P为Processor(处理器)之意。
M 按内存使用排序。M为Momery之意。
F 排序(进入新的界面,并选择排序的目标字段)。
R 顺序或逆序。
H 显示线程
Z 以多色彩显示top。
l/t/m toggle,load/cpu/内存信息
1 显示多CPU的信息(多核机器上查看每个CPU的使用率)。
W 保存当前top的配置

CPU统计信息

top输出中有一行是关于CPU利用率的统计数据:

Cpu(s):  1.7%us,  7.8%sy,  0.0%ni, 49.5%id, 39.2%wa,  0.7%hi,  1.2%si,  0.0%st
  • us - User Time,CPU执行用户进程的时间,包括NiceTime。
  • sy - System Time,CPU在内核运行时间,包括IRQ和SoftIRQ时间。
  • ni - Nice Time,调整进程优先级所用时间。
  • id - Idle Time,系统空闲时间。
  • wa - Waiting Time,CPU等待I/O完成所用时间。
  • hi - Hard IRQ Time,硬中断时间。
  • si - Soft IRQ Time,软中断时间。
  • st - Steal Time,丢失时间。

关于CPU占用百分比的计算,Linux在时钟中断(Timer Interrupt)时判断,若在用户态,则将时耗计入User Time,若在内核态,则将时耗计入System Time。由于时钟中断的发生点不同,可能计数所得有较大误差:

Linux CPU time

Steal Time(丢失时间)与虚拟化相关。虚拟化(或平台虚拟化)指通过某种方式隐藏物理硬件,从而使多个操作系统可以透明地使用和共享它,提供虚拟化的层(在分层架构中)被称为hypervisor(也称虚拟机管理程序或VMM),而运行于hypervisor之上的操作系统我们称为虚拟机(VM)。hypervisor分两类:

  • hypervisor直接运行于硬件之上。
  • hypervisor允许在另一个操作系统中。

在IBM开发者网络的文档里这样定义Steal Time:

Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is not scheduling this virtual CPU.
Linux CPU time

/proc/stat

/proc/stat记录了CPU使用的详细情况:

$ cat /proc/stat
cpu  10647 13946 38168 7684946 120961 2329 4284 0
cpu0 3875 5683 11724 3894375 18893 1240 1902 0
cpu1 6772 8262 26443 3790571 102068 1089 2382 0
intr 40817308 39379365 9 0 3 3 0 5 0 1 0 0 0 107 0 0 373243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 68949 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 995623 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 4366411
btime 1352770516
processes 6304
procs_running 1
procs_blocked 0

该文件第1行列出了CPU使用详细情况,第2、3行列出了cpu0、cpu1的详细情况。这三行格式一致,我们单看第1行:

cpu  10647 13946 38168 7684946 120961 2329 4284 0

这个顺序与top输出一致,不再赘述:

Cpu(s):  1.7%us,  7.8%sy,  0.0%ni, 49.5%id, 39.2%wa,  0.7%hi,  1.2%si,  0.0%st

我们可以通过这些数值计算出系统各种状态下占用CPU的百分比(top输出的cpu利用率就来自于此),进而可以计算出系统运行时间:

$ echo "10647 13946 38168 7684946 120961 2329 4284 0" | tr " " "\n" | awk 'BEGIN{t=0}{t+=$1}END{print t/100/2}'
39376.4
$ uptime
 20:31:29 up 10:56,  4 users,  load average: 0.00, 0.00, 0.00
$ echo "10*60*60+56*60"|bc 
39360

注意awk计算t/100/2,通过Jiffies(1 Jiffy = 0.01秒)计算时间是t/100,这里是2个CPU的统计结果,因此除以2。

ctxt - 上下文切换次数。

btime - 表示系统的启动时间。这个时间是相对于UNIX Epoch经历的秒数:1352770516

$ date -d @1352770516     
2012年 11月 13日 星期二 09:35:16 CST

processes - 系统启动以来创建的进程数。

参考

IBM开发者网络 - CPU time accounting

IBM开发者网络 - 剖析Linux hypervisor

分享

0