问:
在执行某些命令或脚本的时候,我们会想知道这条命令执行了多长时间。
解:
正常的思路肯定执行前打印下date,执行完打印下date。
但是在Linux中,还有个很有趣的time命令,很简单地就可以知道你这条命令执行了多长时间,并且记录了用户使用cpu的时间、系统使用cpu的时间以及实际执行的时间。
例1:
# 查看/bin目录下的文件
time ls /bin
[root@yaomm ~]# time ls /bin
[ dos2unix ipcalc mysql prlimit systemd-escape
a2p dracut ipcmk mysqladmin prove systemd-firstboot
abs2rel dtrace ipcrm mysqlbinlog prtstat systemd-hwdb
……
real 0m0.055s
user 0m0.003s
sys 0m0.006s
real:实际执行时间。
user:用户占用CPU时间。
sys:系统占用CPU时间。
我们看到real time用了0分0点55秒(0m0.055s)时间。为什么real > user + sys呢?
因为real time 是包含了其他进程执行的时间和IO阻塞的时间的。
简单理解下,消失的时间大部分都是用来去做磁盘io、内存读写的工作了了。
例2:
[root@yaomm ~]# time find / -size +100M -name "*.jar"
/home/hc/jar_deploy/war/UserService.jar
/home/hc/jar_deploy/war/CommonService.jar
/home/hc/jar_deploy/war/OrderService.jar
……
real 0m1.017s
user 0m0.415s
sys 0m0.601s
我们在用type -a 命令来看看time这个命令的特殊:
[root@yaomm ~]# type -a time
time is a shell keyword
time is /usr/bin/time
可以看到time其实是一个Shell关键字。
那还有一个命令/usr/bin/time,它们有什么不同呢?
来执行一下:
# 注意,加了-v 参数
/usr/bin/time -v find / -size +100M -name "*.jar"
[root@yaomm ~]# /usr/bin/time -v find / -size +100M -name "*.jar"
/home/hc/jar_deploy/war/UserService.jar
/home/hc/jar_deploy/war/CommonService.jar
/home/hc/jar_deploy/war/OrderService.jar
/home/hc/jar_deploy/war/StoreService.jar
/home/hc/jar_deploy/war/CommunityService.jar
…………
Command being timed: "find / -size +100M -name *.jar"
User time (seconds): 0.42
System time (seconds): 0.64
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.07
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): 1576
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1396
Voluntary context switches: 2
Involuntary context switches: 138
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
其中详细描述了命令执行的过程。使用的cpu、io、缓存等信息。
例如
# 磁盘读取的页数据
Major (requiring I/O) page faults: 0
# 操作系统缓存读取的页数据
Minor (reclaiming a frame) page faults: 1396
结语:
本次其实共学到了三个命令:
time
/user/bin/time -v
type -a
如果觉得有趣、实用的话,不妨点个在看吧。