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/meanings-of-real-user-and-sys-in-time-output/