在Unix中,wall-clock-time、user-cpu-time和system-cpu-time具体是什么?

211
根据名称,我可以猜测一些内容,但是在Unix中,"wall-clock-time"、"user-cpu-time"和"system-cpu-time"具体指什么?
"user-cpu time"是执行用户代码所花费的时间,而"system-cpu time"是由于需要特权操作(如将I/O写入磁盘)而在内核中花费的时间。 "wall-clock time"是否真正表示进程在CPU上花费的秒数,还是名称有误导性?这个测量单位是什么?

可能是time(1)输出中'real'、'user'和'sys'的含义是什么?的重复问题。 - Ciro Santilli OurBigBook.com
4个回答

223

挂钟时间是指从进程开始到现在经过的时间,一个挂在墙上的时钟(或手中的秒表)会测量出这段时间。

用户CPU时间和系统CPU时间基本上就像你所说的那样 - 用户代码执行的时间和内核代码执行的时间。

单位是秒(和子秒,可能是微秒或纳秒)。

挂钟时间不是进程在CPU上花费的秒数;它是经过的时间,包括等待其轮到运行在CPU上的时间(同时其他进程得到运行的时间)。


38
这是否意味着挂钟时间始终会比CPU时间长? - Pacerier
77
在单核机器上是这样,但多核机器和多线程程序可以在每个经过的秒钟使用超过1个CPU秒。 - Jonathan Leffler
@JonathanLeffler 谢谢您的回答,我想要获取经过的纳秒数,但是使用公式 CPUtime = #clock_cycles / clock_rate 计算 CPU 时间不能与计算已经过时间相同。您知道我能否从 CPU 时间中获取已经过时间吗? - Bionix1441
2
@Bionix1441:你不能从CPU时间中推导出经过的时间,原因有很多。首先,一个进程可能会空闲,不消耗任何CPU时间,一段时间内什么都不做(例如,守护进程等待客户端通过网络连接到它),所以经过的时间可能是几天。其次,如果它正在运行,可能有多个线程,如果有4个或更多核心的系统上有4个线程,则每秒经过的时间可能会累积4个CPU秒的努力。这些都表明没有简单(甚至复杂)的公式可用。 - Jonathan Leffler
@JonathanLeffler: 我仍然对"用户代码"和"内核代码"感到困惑。你能否请更清楚地解释一下?谢谢。 - Chau Pham
2
@Catbuilts:你是否知道Unix内核与用户程序是分开运行的。当你的程序进行系统调用(例如read()getpid())时,内核会代表你的程序执行代码。内核还处理抢占式多任务,以便其他程序有机会运行,并进行一些常规的维护工作,以保持系统平稳运行。这段代码在“内核代码”(也称为“内核模式”)中执行。这与你编写的代码和运行的用户库(包括系统C库)是不同的。 - Jonathan Leffler

48

墙上时钟时间:根据计算机内部时钟流逝的时间,应该与外部世界的时间相匹配。这与 CPU 使用率无关;仅供参考。

用户 CPU 时间和系统时间:正是您想的那样。系统调用包括 I/O 调用(如read write 等)都是通过跳转到内核代码并执行来执行的。

如果壁钟时间 < CPU 时间,则表示您正在并行执行程序。如果墙时钟时间 > CPU 时间,则表示您正在等待磁盘、网络或其他设备。

所有时间均以秒为单位,符合 SI 标准。


13
time [WHAT-EVER-COMMAND]

real    7m2.444s
user    76m14.607s
sys 2m29.432s

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24

真实时间或墙钟时间

real 7m2.444s

在一个24核处理器的系统上,该命令/进程利用所有给定的核心进行最大并行处理,完成此操作需要超过7分钟的时间。

用户时间

user 76m14.607s

该命令/进程已经使用了这么多的CPU时间。

换句话说,在单核CPU的机器上,real时间和user时间将近相等,因此同样的命令需要大约76分钟才能完成。

系统时间

sys 2m29.432s

这是内核执行所有基本/系统级别操作以运行此命令所需的时间,包括上下文切换、资源分配等。

注意:此示例假设您的命令利用并行处理/线程。

详细的手册页面:https://linux.die.net/man/1/time


鉴于您发布的时间,执行并行任务似乎已完成一半左右?(我只是用 (用户时间 + 系统时间) / 实际时间 来表示。) - dtc
2
我来晚了,但 real > (user + sys)/(num cpus) 总是成立的,因为程序还会花时间空闲或与其他程序共享,并且它可能无法100%地利用所有核心(甚至在任何时候都不行)。如果是低开销的专用机器,则非常接近。 - Jared

7

墙钟时间就是指你挂在墙上(或手腕上)的时钟所测量的经过的时间。

用户 CPU 时间是指花费在“用户空间”的时间,也就是花费在非内核进程上的时间。

系统 CPU 时间是指花费在内核中的时间,通常是用于处理系统调用的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接