常用shell命令 - time

time

在需要执行的命令前,添加time命令,直接返回任务运行的几个时间统计指标,信息如下:

1
2
3
4
5
6
7
(base)[liubo4@tj*]$time  ls $File
$File

real 0m0.007s
user 0m0.000s
sys 0m0.002s
(base)[liubo4@tj*]$

(1) real:从进程 ls 开始执行到完成所耗费的 CPU 总时间。该时间包括 ls 进程执行时实际使用的 CPU 时间,ls 进程耗费在阻塞上的时间(如等待完成 I/O 操作)和其他进程所耗费的时间(Linux 是多进程系统,ls 在执行过程中,可能会有别的进程抢占 CPU)。

(2) user:进程 ls 执行用户态代码所耗费的 CPU 时间。该时间仅指 ls 进程执行时实际使用的 CPU 时间,而不包括其他进程所使用的时间和本进程阻塞的时间。

(3) sys:进程 ls 在内核态运行所耗费的 CPU 时间,即执行内核系统调用所耗费的 CPU 时间。

单线程任务,会存在 real > user + sys,但是在多线程,三者间没有明确的关系

\time

time是我们比较常用的, 接触linux系统的人也基本都了解过,本文也主要是介绍 \time, 除了time命令返回的三个时间外, \time还可以返回任务的内存、I/O 等的使用情况。
示例如下:

1
2
3
4
(base)[liubo4@tj-login-0-1 InDel]$\time  ls $File
$File
0.00user 0.00system 0:00.00elapsed 11%CPU (0avgtext+0avgdata 928maxresident)k
0inputs+0outputs (0major+295minor)pagefaults 0swaps

可以看到多了很多除了时间之外的指标,默认是简略版输出,初次使用不熟悉时,我们可以添加 -v 参数,会提供每个参数更详细的说明信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(base)[liubo4@tj-login-0-1 InDel]$\time -v ls $File
$File
Command being timed: "ls $File "
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 11%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 928
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 296
Voluntary context switches: 43
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

指标介绍

时间

指 标 含 义
Elapsed (wall clock) time 执行命令所花费的时间,格式是:[hour]:minute:second
System time 命令执行时在内核模式所花费的时间,单位是秒
User time 命令执行时在使用者模式所花费的时间,单位是秒
Percent of CPU this job got 命令执行时 CPU 的占用比例。其实这个数字就是内核模式的 CPU 时间加上使用者模式的 CPU 时间除以总时间

内存

指 标 含 义
Maximum resident set size 执行程序所占用内存的最大值。单位是 KB
Average resident set size 执行程序所占用内存的平均值,单位是 KB
Average total size 执行程序所占用的内存总量(stack+data+text)的平均大小, 单位是 KB
Average unshared data size 执行程序所占用的私有数据区(unshared data area)的平均 大小,单位是 KB
Average stack size 执行程序所占用的私有堆栈(unshared stack)的平均大小, 单位是 KB
Average shared text size 执行程序间共享内容(shared text)的平均值,单位是 KB
Page size 系统内存页的大小,单位是 byte。对于同一个系统来说,这 是个常数

I/O

指 标 含 义
Major (requiring I/O) page faults 此程序的主要内存页错误发生的次数。所谓的主要内存页错误是指某一内存页己经詈换到 SWAP 分区中,又被其他程序使用过,该页的内容必须从 SWAP 分区里再读出来才能使用
Minor (reclaiming a frame) page faults 此程序的次要内存页错误发生的次数。 所谓的次要内存页错误是指某一内存页虽然己经詈换到 SWAP 中,但尚未被其他程序使用。此时该页的内容并未 被破坏,不必从 SWAP 分区里读出来即可直接使用
Swaps 此程序被交换到 SWAP 分区的次数
Involuntary context switches 此程序被强迫中断(如 CPU 时间耗尽)的次数
Voluntary context switches 此程序自愿中断(I/O 执行完毕,磁碟读取完成等)的次数
File system inputs 此程序所输入的文件数
File system outputs 此程序所输出的文件数
Socket messages received 此程序所收到的 Socket Message
Socket messages sent 此程序所送出的 Socket Message
Signals delivered 此程序所收到的信号数
Exit status 命令退出状态

说明

在 time 命令的输出中,Elapsed time 是通过系统调用 gettimeofday 获取到的结束时间和起始时间相减得到的。因此,time 对于运行时间较短的任务计时时,会产生一定误差。time 命令输出的时间统计精度基本在 10 毫秒级。,少于 10 毫秒的程序,真的是连 time 也无法精确计时。

-------------本文结束感谢您的阅读-------------