Linux time命令详解

参考:http://blog.he96.com/2011/01/linux-timewhat-do-real-user-and-sys.html

real,user,sys

我们常用linux中的time命令计算某个程序的运行耗时,用户态CPU耗时,系统态COU耗时。
例如:

1
2
3
4
time foo
real 0m0.020s
user 0m0.020s
sys 0m0.000s

现在我们探讨一下上述三个时间分别代表的含义:

  • real: 表示a.out程序的实际的运行耗时,也就是在a.out运行开始时刻你看了一下手表,a.out运行结束时刻看了一眼手表,两次时间的差值就是real的值。例如使用time sleep 2的时候real值为2
  • user: a.out运行在用户态CPU的时间
  • sys: a.out运行在核心态CPU的时间

用户态和核心态

然后我们讲一下用户态和核心态:

  • 核心态(kernal mode): 在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为哪些最底层的,由操作系统提供的,可信可靠耳朵代码来运行的。内核态崩溃将是灾难性的,它会影响到整个系统。
  • 用户态(User mode):在用户态,代码不具备直接访问底层硬件或者内存的能力,而必须借助操作系统提供的可靠的,底层的API来访问硬件或者内存。由于这种隔离带来的保护作用,用户态代码崩溃,操作系统可以正常恢复。我们大多数代码是运行在用户态。

区分内核态和用户态的作用:隔离保护,使得系统更稳定。
使用这三个时间我们可以计算当前程序CPU的使用率:
CPU Usage = (user + sys) / real_time

常见误区

  • realtime = user + sys
  • realtime > user + sys
    由于有一些程序需要等待I/O等导致realtime与user+sys不相等
    当在多核CPU的情况下第二种情况不成立