Linux系统之time命令的基本使用

Linux系统之time命令的基本使用

一、time命令介绍

统计给定命令所花费的总时间:time 命令在 Unix 和类 Unix 系统(如 Linux)中被用来测量一个命令或程序的执行时间。它能够报告用户 CPU 时间、系统 CPU 时间以及实际经过的时间(也称为墙钟时间)。

二、time版本介绍

2.1 time版本简介

在大多数 Unix 和类 Unix 系统中,time 命令有两个版本:一个是 shell 内置的 time,另一个是 GNU time,通常位于 /usr/bin/time。这两个版本有一些关键的区别:

  • Shell 内置的 time
bash 复制代码
位置:这个 time 是 shell 的一部分,不是独立的可执行文件。
选项:它支持较少的选项,通常只支持基本的时间测量功能。
输出:它的输出格式比较固定,一般只能显示 real, user, sys 时间。
  • GNU time
bash 复制代码
位置:这个 time 通常是 /usr/bin/time,是一个独立的可执行文件。
选项:它支持更多的选项,比如 -o(将输出重定向到文件)、-a(追加到文件)、-f(自定义输出格式)等。

2.2 检查 time 的类型

可以使用 type -a time 命令来查看系统中所有可用的 time 版本:

bash 复制代码
type -a time

如果返回的结果中:

time is a shell keyword #shell 内置的 time

time is /usr/bin/time #第二行表示 GNU time。

2.3 安装GNU time

如果 GNU time 没有安装,你可以通过包管理器来安装它。在 openEuler 中,通常使用 dnf 包管理器:

bash 复制代码
dnf install time

三、time命令的使用帮助

3.1 Shell内置time用法

  • 基本语法
bash 复制代码
time [选项] 命令(指令:指定需要运行的额指令及其参数)

3.2 GNU time用法

使用 /usr/bin/time --help查询 GNU time用法

bash 复制代码
[root@openEuler-test ~]# /usr/bin/time --help
Usage: /usr/bin/time [OPTIONS] COMMAND [ARG]...
Run COMMAND, then print system resource usage.

  -a, --append              with -o FILE, append instead of overwriting
  -f, --format=FORMAT       use the specified FORMAT instead of the default
  -o, --output=FILE         write to FILE instead of STDERR
  -p, --portability         print POSIX standard 1003.2 conformant string:
                              real %%e
                              user %%U
                              sys %%S
  -q, --quiet               do not print information about abnormal program
                            termination (non-zero exit codes or signals)
  -v, --verbose             print all resource usage information instead of
                            the default format
  -h,  --help               display this help and exit
  -V,  --version            output version information and exit

Commonly usaged format sequences for -f/--format:
(see documentation for full list)
  %%   a literal '%'
  %C   command line and arguments
  %c   involuntary context switches
  %E   elapsed real time (wall clock) in [hour:]min:sec
  %e   elapsed real time (wall clock) in seconds
  %F   major page faults
  %M   maximum resident set size in KB
  %P   percent of CPU this job got
  %R   minor page faults
  %S   system (kernel) time in seconds
  %U   user time in seconds
  %w   voluntary context switches
  %x   exit status of command

选项解释·:

选项 描述
-a, --append -o FILE 一起使用时,追加到文件而不是覆盖。
-f, --format=FORMAT 使用指定的 FORMAT 而不是默认格式。
-o, --output=FILE 将输出写入指定的文件而不是标准错误(STDERR)。
-p, --portability 打印符合 POSIX 标准 1003.2 的字符串: real %%e user %%U sys %%S
-q, --quiet 不打印关于异常程序终止的信息(非零退出码或信号)。
-v, --verbose 打印所有资源使用信息,而不是默认格式。
-h, --help 显示帮助信息并退出。
-V, --version 输出版本信息并退出。

四、time命令的直接使用

time后跟执行的命令,则可以可以统计该命令的时间消耗。

bash 复制代码
[root@openEuler-test ~]# time hostname
openEuler-test

real	0m0.002s
user	0m0.000s
sys	0m0.001s

其中的三项输出的意思,如下所示:

  • real 表示的是整个过程的实际经过时间。
  • user 表示的是用户空间中的代码执行所花费的 CPU 时间。
  • sys 表示的是内核空间中的代码执行所花费的 CPU 时间。

五、/usr/bin/time的基本使用

5.1 /usr/bin/time直接使用

bash 复制代码
[root@openEuler-test ~]# /usr/bin/time ls
aa  aa.txt  anaconda-ks.cfg  birthday-cake.jpg	gift.jpg  k8s.png  output.png  qrcode.svg  wordpress-4.9.1-zh_CN.tar.gz
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 2424maxresident)k
0inputs+0outputs (0major+113minor)pagefaults 0swaps
  • 第一行:

第一行是 ls 命令的实际输出,列出了当前目录下的文件和目录。

  • 第二行

0.00user:用户空间中的代码执行所花费的 CPU 时间为 0 秒。

0.00system:内核空间中的代码执行所花费的 CPU 时间为 0 秒。

0:00.00elapsed:实际经过的时间(wall clock time)为 0 秒。

100%CPU:CPU 使用率为 100%。这个值是 (user + system) / elapsed 的百分比。由于 elapsed 时间非常短,所以即使 user 和 system 时间都是 0,CPU 使用率也可能显示为 100%。

(0avgtext+0avgdata 2424maxresident)k:

0avgtext:平均文本段大小为 0 KB。

0avgdata:平均数据段大小为 0 KB。

2424maxresident:最大驻留内存大小为 2424 KB。

  • 第三行

0inputs+0outputs:输入和输出的数据量分别为 0 字节。

(0major+113minor)pagefaults:

0major:主要页错误(需要从磁盘读取页面)的数量为 0。

113minor:次要页错误(可以在内存中找到页面)的数量为 113。

0swaps:交换操作的次数为 0。

5.2 打印标准输出

使用-p选项,打印以下标准输出。

bash 复制代码
[root@openEuler-test ~]# /usr/bin/time -p ls
aa  aa.txt  anaconda-ks.cfg  birthday-cake.jpg	gift.jpg  k8s.png  output.png  qrcode.svg  wordpress-4.9.1-zh_CN.tar.gz
real 0.00
user 0.00
sys 0.00

5.3 打印所有资源信息

使用-v选项,打印所有资源信息。

bash 复制代码
[root@openEuler-test ~]#  /usr/bin/time -v ls
aa  aa.txt  anaconda-ks.cfg  birthday-cake.jpg	gift.jpg  k8s.png  output.png  qrcode.svg  wordpress-4.9.1-zh_CN.tar.gz
	Command being timed: "ls"
	User time (seconds): 0.00
	System time (seconds): 0.00
	Percent of CPU this job got: 0%
	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): 2456
	Average resident set size (kbytes): 0
	Major (requiring I/O) page faults: 0
	Minor (reclaiming a frame) page faults: 113
	Voluntary context switches: 1
	Involuntary context switches: 0
	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
字段 描述
Command being timed "ls" 正在计时的命令是 ls
User time (seconds) 0.00 用户空间中的代码执行所花费的 CPU 时间(秒)。
System time (seconds) 0.00 内核空间中的代码执行所花费的 CPU 时间(秒)。
Percent of CPU this job got 0% 该任务获得的 CPU 百分比。
Elapsed (wall clock) time 0:00.00 实际经过的时间(墙钟时间),格式为 h:mm:ssm:ss
Average shared text size (kbytes) 0 平均共享文本段大小(KB)。
Average unshared data size (kbytes) 0 平均非共享数据段大小(KB)。
Average stack size (kbytes) 0 平均堆栈大小(KB)。
Average total size (kbytes) 0 平均总大小(KB)。
Maximum resident set size (kbytes) 2456 最大驻留内存大小(KB)。
Average resident set size (kbytes) 0 平均驻留内存大小(KB)。
Major (requiring I/O) page faults 0 需要 I/O 的主要页错误次数。
Minor (reclaiming a frame) page faults 113 重新分配帧的次要页错误次数。
Voluntary context switches 1 自愿上下文切换次数。
Involuntary context switches 0 非自愿上下文切换次数。
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 命令的退出状态码。

5.4 将执行时间写入到文件中

使用-o选项将执行时间写入到文件中:

bash 复制代码
[root@openEuler-test ~]# /usr/bin/time -o aa.txt ping www.baidu.com -c 4
PING www.a.shifen.com (153.3.238.102) 56(84) bytes of data.
64 bytes from 153.3.238.102 (153.3.238.102): icmp_seq=1 ttl=53 time=14.8 ms
64 bytes from 153.3.238.102 (153.3.238.102): icmp_seq=2 ttl=53 time=14.2 ms
64 bytes from 153.3.238.102 (153.3.238.102): icmp_seq=3 ttl=53 time=14.3 ms
64 bytes from 153.3.238.102 (153.3.238.102): icmp_seq=4 ttl=53 time=15.0 ms

--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 14.212/14.590/14.991/0.320 ms
  • 查看该文件内容:
bash 复制代码
[root@openEuler-test ~]# cat aa.txt
0.00user 0.00system 0:03.05elapsed 0%CPU (0avgtext+0avgdata 2920maxresident)k
0inputs+0outputs (0major+144minor)pagefaults 0swaps

5.5 追加信息

使用-a选项,将/usr/bin/time命令的输出信息追加到aa.txt文件中,而不会覆盖该文件。

bash 复制代码
[root@openEuler-test ~]# /usr/bin/time -a -o aa.txt ls
aa  aa.txt  anaconda-ks.cfg  birthday-cake.jpg	gift.jpg  k8s.png  output.png  qrcode.svg  wordpress-4.9.1-zh_CN.tar.gz
[root@openEuler-test ~]# cat aa.txt
0.00user 0.00system 0:03.05elapsed 0%CPU (0avgtext+0avgdata 2920maxresident)k
0inputs+0outputs (0major+144minor)pagefaults 0swaps
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 2472maxresident)k
0inputs+0outputs (0major+115minor)pagefaults 0swaps

5.6 格式化时间输出

可参考以下命令,进行格式化时间输出。

bash 复制代码
/usr/bin/time -f "time: %U" ls
参数 描述
%E 实际经过时间(real time),显示格式为 [小时:]分钟:秒
%U 用户空间中的代码执行所花费的 CPU 时间(user time)。
%S 内核空间中的代码执行所花费的 CPU 时间(system time)。
%C 进行计时的命令名称及其命令行参数。
%D 进程非共享数据区域的大小,以 KB 为单位。
%x 命令退出状态码。
%k 进程接收到的信号数量。
%w 进程被交换出主存的次数。
%Z 系统的页面大小(page size),这是一个系统常量,不同系统中该值可能不同。
%P 进程所获取的 CPU 时间百分比,这个值等于 (user + system) 时间 / 总运行时间
%K 进程的平均总内存使用量(包括 data + stack + text),单位是 KB。
%W 进程主动进行上下文切换的次数,例如等待 I/O 操作完成。
%c 进程被迫进行上下文切换的次数(由于时间片到期)。

六、注意事项

  • 区分 Shell 内置 time 和 GNU time :确保你使用的是 /usr/bin/time 而不是 shell 内置的 time,以利用更多高级选项。
  • 使用 -o 选项重定向输出 :使用 -o 选项将 time 的输出重定向到文件中,以便后续分析。
  • 自定义输出格式 :使用 -f 选项自定义输出格式,以便获取更详细的资源使用信息。
  • 启用详细模式 :使用 -v 选项启用详细模式,以获取所有资源使用信息。
  • 处理异常终止 :使用 -q 选项来抑制关于异常程序终止的信息,如非零退出码或信号。
  • 检查系统路径 :确保 /usr/bin/time 在你的 PATH 环境变量中,或者直接使用完整路径调用。
  • 注意时间精度 :对于非常短的命令,time 可能无法提供高精度的时间测量,因为系统计时器有最小分辨率。
  • 理解百分比 CPU 使用率 :CPU 使用率是基于 (user + system) / elapsed 计算的,对于极短的命令可能会显示为 100%。
  • 查看帮助和版本信息 :使用 -h--help 查看帮助信息,使用 -V--version 查看版本信息。
相关推荐
sinat_384241093 小时前
使用 npm 安装 Electron 作为开发依赖
服务器
朝九晚五ฺ3 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream3 小时前
Linux的桌面
linux
xiaozhiwise4 小时前
Makefile 之 自动化变量
linux
Kkooe4 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒5 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
意疏6 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
虚拟网络工程师6 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
BLEACH-heiqiyihu6 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器