time命令:测量命令的执行时间或者系统资源的使用情况「转」
sinye56 2024-11-17 01:32 3 浏览 0 评论
转自:http://c.biancheng.net/linux/time.html
这里我们要学习的 time 命令是用来测量 Linux 程序执行时间的命令,而不是用来显示系统时间的命令。不是吧,这也太分裂了吧,那显示系统时间的命令是什么呢?是 date,马上百度一下,你就清楚了。Linux 手册中是这样介绍 time 命令的:“time a simple command or give resource usage”,即测量命令的执行时间,或者给出系统资源的使用情况。
time 的简单用法
如果你想查看一条命令(比如 ls)到底执行了多长时间,我们可以这样做:
[roc@roclinux ~]$ time ls
program public_html repo rocscm
real 0m0.002s
user 0m0.002s
sys 0m0.000s
看到没有,执行时间一下子就统计出来了。但输出内容中有三个统计时间,real、user 和 sys,它们都代表什么含义呢?哪个才是 ls 命令的执行时间呢?下面我们就一起来看看这三个统计时间。(1) real:从进程 ls 开始执行到完成所耗费的 CPU 总时间。该时间包括 ls 进程执行时实际使用的 CPU 时间,ls 进程耗费在阻塞上的时间(如等待完成 I/O 操作)和其他进程所耗费的时间(Linux 是多进程系统,ls 在执行过程中,可能会有别的进程抢占 CPU)。(2) user:进程 ls 执行用户态代码所耗费的 CPU 时间。该时间仅指 ls 进程执行时实际使用的 CPU 时间,而不包括其他进程所使用的时间和本进程阻塞的时间。(3) sys:进程 ls 在内核态运行所耗费的 CPU 时间,即执行内核系统调用所耗费的 CPU 时间。现在,我们应该对这三个时间非常清楚了吧。ls 命令的真正执行时间是多少?答案就是 user+sys 的时间,但一般情况下,real=user+sys,因而我们就使用 real 的时间作为 ls 的执行时间了(注意,这里会有几个坑,我们将在后面进行介绍)。好了,time 的最基本用法介绍完毕,就这么简单。
消失的时间
上面说 real 时间中会有几个坑,下面我们就来详细地看一看。情景一:
[roc@roclinux ~]$ time sudo find / -name php.ini
real 0m0.193s
user 0m0.076s
sys 0m0.115s
咦,是我数学不好,还是命令执行出错了呢?为什么 0.193s(real)>0.076s(user)+0.115s(sys),而不是相等呢?哈哈,同学,你挺细心的嘛。这既不是你的数学不好,也不是命令执行出错,而是我们对命令执行时间的理解有几个误区。误区一:real_time=user_time+sys_time如果你认为上面的等式一定成立的话,那么请你再理解一下前面关于 real、user 和 sys 的介绍。在前面的表述中,real time 是包含了其他进程的执行时间和进程阻塞时间的,而 usr time+sys time 显然是不包括其他进程的执行时间和进程阻塞时间的。因此,real_time>user_time+sys_time 是非常有可能的。误区二:real_time>user_time+sys_time根据上面的分析,这个关系式应该是成立的吧?嘿嘿,不一定哟。一般来说,在单核 CPU 系统中,这个关系式是成立的,但如果我们的系统是多核 CPU 的话,而有些程序是能够同时利用到多核 CPU 的计算能力的,在这种情况下这个关系式就不成立了。程序利用多核 CPU 的计算能力,可以并行地处理多项事务。就像一件工作,原来是一个 CPU 核去做,现在是两个 CPU 核并行做,那么完成同样工作所花费的总时间是 user_time+sys_time,而两个人并行做却能够在更短的时间内完成,耗时为 real_time。因此,这种情况下,便出现了 real_time<user_time+sys_time 的情况。误区三:real_time<user_time+sys_time多核情况下,real_time<user_time+sys_time 是成立的,那单核呢?显然是 real_time>user_time+sys_time。上面的三个误区有点绕,但结论很重要,就是 real_time 和 user_time+sys_time 的大小关系不是恒久不变的,你需要了解你的 Linux 服务器,是单核,还是多核,这样才能正确地确定它们的关系。情景二:
[roc@roclinux ~]$ time sudo find / -name mysql.sh
/etc/profile.d/mysql.sh
real 0m6.776s
user 0m1.101s
sys 0m1.363s
我们执行 find/-name mysql.sh 搜索文件的命令,显示的命令耗时是 6.776 秒。如果我们再执行一次完全相同的命令:
[roc@roclinux ~]$ time sudo find / -name mysql.sh
/etc/profile.d/mysql.sh
real 0m3.059s
user 0m1.189s
sys 0m1.435s
咦,怎么 real 的时间缩减到了 3.059 秒了,生生少了 3 秒多钟,这又是怎么回事呢?为什么同样的命令在第二次执行时快这么多呢?这个现象跟 Linux 操作系统的运行原理有关,find 命令在第一次执行后,系统会对一些文件做缓存,在第二次执行时,就正好使用到了这些缓存中的数据,因此执行速度就变快了很多。看过这个示例后,如果仍有同学不问青红皂白地抱怨 time 命令的计时误差大,那可真是冤枉 time 啦。time 的 man 手册中说,它不仅可以测量运行时间,还可以测量内存、I/O 等的使用情况,但为什么上面示例中的 time 命令的结果中却没有显示出这些信息呢?难道是 man 手册出现了错误?NO,NO,NO(重要的事情要说三遍),其实上面使用的 time 真的是“巧妇难为无米之炊”,我们之前所用的 time 命令是 Bash 的内置命令,功能比较弱;而更强大的 time 命令隐藏在 /usr/bin/ 目录下,这个命令才是世外高人。如果我们在 /user/bin/ 中并没有找到传说中那个强大的 time 命令,那么应该是没有安装 time 这个工具,安装方法也很简单:
[root@roclinux ~]# yum install time
安装完成后,我们就一起来见识 time 命令的庐山真面目吧!我们特意在 time 命令前加了一个斜线(\),就是为了调用那个强大的 time 命令,而非 Bash 内置的 time 命令。
[root@roclinux ~]# \time ls
bin dev lib media proc seLinux tmp
boot etc lib64 mnt root srv usr
cgroup home lost+found opt sbin sys var
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 956maxresident)k
0inputs+0outputs (0major+289minor)pagefaults 0swaps
请注意输出内容中的最后两行,打印了很多指标数据,但似乎有点晦涩难懂。这时我们可以使用一个 -v 选项,这样可以打印出更详细的信息。
[root@roclinux /]# \time -v ls
bin dev lib media proc seLinux tmp
boot etc lib64 mnt root srv usr
cgroup home lost+found opt sbin sys var
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): 956
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 292
Voluntary context switches: 1
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(h:mm:ss or m:ss):0:00.00,值是 0,难道执行 ls 命令没有消耗时间?非也,事情的真相是这样的:在 time 命令的输出中,Elapsed time 是通过系统调用 gettimeofday 获取到的结束时间和起始时间相减得到的。因此,time 对于运行时间较短的任务计时时,会产生一定误差。time 命令输出的时间统计精度基本在 10 毫秒级。原来是精度的问题啊,少于 10 毫秒的程序,真的是连 time 也无法精确计时。
time 命令输出指标介绍
time 命令可以显示的资源共有三大项,分别是:时间、内存和 I/O。下面来具体看看 time 命令都显示了哪些指标数据。(1) 时间
指 标 | 含 义 |
---|---|
Elapsed (wall clock) time | 执行命令所花费的时间,格式是:[hour]:minute:second |
System time | 命令执行时在内核模式所花费的时间,单位是秒 |
User time | 命令执行时在使用者模式所花费的时间,单位是秒 |
Percent of CPU this job got | 命令执行时 CPU 的占用比例。 |
(2) 内存
指 标 | 含 义 |
---|---|
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。对于同一个系统来说,这 是个常数 |
(3) I/O
指 标 | 含 义 |
---|---|
Major (requiring I/O) page faults | 此程序的主要内存页错误发生的次数。 |
Minor (reclaiming a frame) page faults | 此程序的次要内存页错误发生的次数。 |
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 | 命令退出状态 |
相关推荐
- Linux在线安装JDK1.8
-
首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...
- Linux安装JDK,超详细
-
1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...
- Linux安装jdk1.8(超级详细)
-
前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...
- Linux系统安装JDK教程
-
下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...
- 干货|JDK下载安装与环境变量配置图文教程「超详细」
-
1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...
- Linux下安装jdk1.8
-
一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...
- Linux上安装JDK
-
以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...
- Linux系统的一些常用目录以及介绍
-
根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...
- Linux系统目录结构
-
一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...
- Linux文件查找
-
在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...
- 嵌入式linux基本操作之查找文件
-
对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...
- linux系统查看软件安装目录的方法
-
linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...
- Linux下如何对目录中的文件进行统计
-
统计目录中的文件数量...
- Linux常见文件目录管理命令
-
touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...
- Linux常用查找文件方法总结
-
一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- 关闭防火墙linux (53)