Linux性能优化之time

Linux性能优化之time

1 time简介

time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统时间的(这是date命令干的事情)。一个程序在运行时使用的系统资源通常包括CPU、Memory和I/O等,其中CPU资源的统计包括实际使用时间(real time)、用户态使用时间(the process spent in user mode)、内核态使用时间(the process spent in kernel mode)。但是简单的使用time命令并不能得到内存和I/O的统计数据。

2 time用法

# time -h
time: invalid option -- 'h'
BusyBox v1.31.1 (2020-07-20 18:00:12 CST) multi-call binary.
Usage: time [-vpa] [-o FILE] PROG ARGS
Run PROG, display resource usage when it exits
        -v      Verbose
        -p      POSIX output format
        -f FMT  Custom format
        -o FILE Write result to FILE
        -a      Append (else overwrite)

2.1 参数详解

参数	含义
-v	详细显示程序的时间和统计信息。
-p	以POSIX缺省的时间格式打印时间统计结果,单位为秒。
-f	以 FORMAT 字串设定显示方式。当这个选项没有被设定的时候,会用系统预设的格式。不过你可以用环境变数 time 来设定这个格式,如此一来就不必每次登入系统都要设定一次。
-o	将结果输出到指定的文件
-a	配合-o使用,会将结果追加到文件的末端,而不会覆盖原有的内容。

2.2 字段详解

字段	含义
real	从command命令行开始执行到运行终止的消逝时间
user	命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和
system	命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和

其中,用户CPU时间和系统CPU时间之和为CPU时间,即命令占用CPU执行的时间总和。实际时间要大于CPU时间,因为Linux是多任务操作系统,往往在执行一条命令时,系统还要处理其它任务。
另一个需要注意的问题是即使每次执行相同命令,但所花费的时间也是不一样,其花费时间是与系统运行相关的。

字段	含义
Command being timed	测试的应用程序名
User time (seconds)	cpu花在用户空间的时间
System time (seconds)	cpu花在内核空间的时间
Percent of CPU this job got	进程运行消耗cpu的百分比
Elapsed (wall clock) time (h:mm:ss or m:ss)	应用程序从启动到完成所经历的时间
Average shared text size (kbytes)	
Average unshared data size (kbytes)	
Average stack size (kbytes)	
Average total size (kbytes)	
Maximum resident set size (kbytes)	
Average resident set size (kbytes)	
Major (requiring I/O) page faults	主缺页故障的数量或需要访问磁盘读取内存页的页故障数量
Minor (reclaiming a frame) page faults	次缺页故障的数量或不需要访问磁盘即可解决的页故障
Voluntary context switches	进程让出cpu(比如进入休眠)的次数
Involuntary context switches	进程被迫让出cpu的次数
Swaps	进程被交换到磁盘的次数
File system inputs	文件系统读的数据量
File system outputs	文件系统写的数据量
Socket messages sent	
Socket messages received	
Signals delivered	
Page size (bytes)	操作系统的页面大小
Exit status	应用程序退出的状态

3 time使用示例

3.1 显示应用执行时间

第一次:
在这里插入图片描述

第二次:
在这里插入图片描述

解释(1):real远大于user加上sys,因为find需要遍历各个目录,需要大量的I/O操作,而磁盘I/O通常是最慢的环节,因此大部分时间find进程都在等待磁盘I/O完成。
解释(2):再次运行的时候,发现real time变得很小了,应该是操作系统将刚才操作过的一些文件缓存了的缘故,因而大大减少了磁盘I/O。使用-p参数时,直接打印所需时间的数值,单位为秒,木有单位感觉怪怪的。

3.2 显示详细应用程序执行时间

在这里插入图片描述

3.3 输出信息的重定向到文件

在这里插入图片描述

由上测试发现,time命令的输出信息是打印在标准错误输出上的。而cat的信息被重定向到b.txt中。
通过上面的尝试,我们发现,因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后面的命令来的,time命令本身的输出并不会被重定向的。
解决方法一:
在这里插入图片描述

第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file 注意分隔符的使用。注意:花括号{}前后需加空格及分号。
解决方法二:
在这里插入图片描述

第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。
小结下:在linux中存在两个time,
一个是bash的命令,另外一个是程序/usr/bin/time;
bash的time命令只能很简单的显示程序执行的时间,而/usr/bin/time程序可以显示很详细的与IO相关的数据,
比如从内存中读取了多少数据,从磁盘中读取了多少数据之类的,以及文件系统的页大小。

4 关于time中的三态的小结

核心态(Kernel Mode):
在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。
用户态(User Mode):
在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的,底层的APIs来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。

我们来看看这三个的关系,这三者之间没有严格的关系,常见的误区有:
误区一: real_time = user_time + sys_time
我们错误的理解为,real time 就等于 user time + sys time,这是不对的,real time是时钟走过的时间,user time 是程序在用户态的cpu时间,sys time 为程序在核心态的cpu时间。
利用这三者,我们可以计算程序运行期间的cpu利用率如下:
%cpu_usage = (user_time + sys_time)/real_time * 100%
在这里插入图片描述

cpu利用率为0,因为本身就是这样的,sleep 了2秒,时钟走过了2秒,但是cpu时间都为0,所以利用率为0
误区二:real_time > user_time + sys_time
一般来说,上面是成立的,上面的情况在单cpu的情况下,往往都是对的。
但是在多核cpu情况下,而且代码写的确实很漂亮,能把多核cpu都利用起来,那么这时候上面的关系就不成立了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值