跳到主要内容

linux cpu 时间基础概念

网上摘录.

wall clock time, CPU time 和 Off-CPU time

这3个time是cpu时间常见的概念.

从一个例子简单了解下,Linux 系统上的 time 命令能够告诉我们的一些信息。

time cksum <some_file>

以 MacBook Pro 2013 为例得到如下信息:

0.22s user 0.04s system 87% cpu 0.301 total

以上信息得知时间都花在了哪里:总时间 0.301s user 时间 0.22s system 时间 0.04s

其中 user 和 system 的含义是 user CPU time 和 system CPU time,之所以会把 CPU 的执行时间分为两个部分,是因为程序在运行时除了执行程序本身代码和一些库的代码,还会调用操作系统提供的函数(即系统调用,程序运行系统调用时有更高的权限),因此程序运行时通常会处于两种状态:用户态和内核态,内核态指的是CPU在运行系统调用时的状态,而用户态就是 CPU 运行非系统调用(即用户自己的代码或一些库)时的状态。因此上面提到的 user CPU time 指的是用户态所花费的时间,而 system CPU time 指的是内核态花费的时间。

会发现 user CPU time + system CPU time = 0.22s + 0.04s = 0.026s 并不等于总时间 0.301s,这是因为这条命令执行的时间内,程序并不是总是在 CPU 上执行,还有可能处于睡眠、等待等状态,比如等待文件从磁盘加载到内存等。这段时间既不算在 user CPU time 也不算在 system CPU time 内。我们把程序在 CPU 上执行的时间(即 user CPU time + system CPU time)称为 CPU time(或 on-CPU time),程序处于睡眠等状态的时间称为 off-CPU time(or blocked time),程序实际运行的时间称为 wall clock time(字面意思是墙上时钟的时间,也就是真实世界中流逝的时间),对于一个给定的线程:wall clock time = CPU time + off-CPU time。

通常在计算密集型(CPU intensive)的任务中 CPU time 会占据较大的比重,而在 I/O 密集型(I/O intensive)任务中 off-CPU time 会占据较大的比重。搞清楚 CPU time 和 off-CPU time 的区别对性能优化十分重要,比如某个程序的性能瓶颈在 off-CPU time 上,而我们选择了一个只观测 CPU time 的工具,那么很难找到真正的性能瓶颈,反之亦然。 ---《profiling 与性能优化总结》