time(1)输出中'real'、'user'和'sys'的含义
time(1)输出中’real’、’user’和’sys’的含义
技术背景
在使用time
命令分析程序性能时,会看到real
、user
和sys
这三个时间统计信息。理解它们的含义有助于我们深入了解程序的运行状况,判断程序是CPU密集型还是I/O密集型等。
实现步骤
理解三个时间的含义
- Real:指实际经过的时间,即从调用开始到结束的挂钟时间。这包括其他进程使用的时间片以及进程处于阻塞状态所花费的时间(例如等待I/O完成)。
- User:是进程在用户模式代码(内核之外)中花费的CPU时间。这仅指执行进程时实际使用的CPU时间,其他进程和进程阻塞的时间不计入该数值。
- Sys:是进程在内核中花费的CPU时间。这意味着在内核中执行系统调用所花费的CPU时间,与仍在用户空间运行的库代码不同。和
user
一样,这只是进程使用的CPU时间。
统计信息的来源
User
和Sys
:根据具体系统,来自wait (2)
或times (2)
。Real
:根据从gettimeofday (2)
调用获取的开始和结束时间计算得出。
核心代码
sleep
系统调用示例
1 |
|
多线程示例
1 |
|
sendfile
示例
1 |
|
最佳实践
- 判断程序类型:通过比较
real
、user
和sys
的时间,可以判断程序是CPU密集型还是I/O密集型。如果user + sys
接近real
,则程序可能是CPU密集型;如果real
远大于user + sys
,则程序可能是I/O密集型。 - 评估并行效率:对于多线程程序,检查
user
时间是否超过real
时间,以及user
与real
的比例是否接近核心数,可评估并行化的有效性。
常见问题
real
与 user + sys
不相等的原因
- 多核心并行:在多核系统中,
user
和sys
时间(以及它们的总和)可能会超过real
时间,因为不同的线程或进程可以并行运行。 - 阻塞等待:进程在等待I/O完成或其他资源时,
real
时间会增加,但user
和sys
时间不会计算等待时间,导致real > user + sys
。
不同实现的time
命令
- Bash关键字:在Ubuntu上直接使用
time <cmd>
,使用的是Bash关键字,其实现使用gettimeofday()
和getrusage()
(如果可用),否则使用times()
。 - GNU Coreutils:使用
/usr/bin/time
时,使用GNU Coreutils实现,会根据情况使用非POSIX的BSDwait3
调用或times
和gettimeofday
。
time(1)输出中'real'、'user'和'sys'的含义
https://119291.xyz/posts/2025-05-16.meanings-of-real-user-and-sys-in-time-output/