首页 运维杂谈秒懂 Linux time 命令:性能调优必备技能!

秒懂 Linux time 命令:性能调优必备技能!

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

秒懂 Linux time 命令:性能调优必备技能!插图
添加图片注释,不超过 140 字(可选)

有时您可能希望根据以下参数分析您的程序:

  • 程序在用户模式下花费的时间
  • 内核模式下程序花费的时间
  • 程序的平均内存使用量
  • ETC

在 Linux 上,我们有一个专门为此目的设计的实用程序“time”。实用程序“time”将程序名称作为输入并显示有关程序使用的资源的信息。此外,如果命令以非零状态存在,则此实用程序会显示警告消息和退出状态。 “time”的语法是:

/usr/bin/time [options] program [arguments]

在上述语法中,“选项”是指一组可选标志/值,可以传递给“时间”实用程序以设置或取消设置特定功能。以下是可用的时间命令选项:

  • -v, –verbose :当需要输出的详细描述时传递此选项。
  • –quite :此选项可防止“时间”实用程序报告程序的状态。
  • -f, –format :此选项允许用户控制“时间”实用程序的输出格式。
  • -p, –portability :此选项设置以下输出格式以使输出符合 POSIX
real %e
user %U
sys %S
  • -o FILE, –output=FILE :此选项允许用户将“时间”实用程序的输出重定向到文件。此选项允许“时间”实用程序覆盖文件 FILE。
  • -a, –append :此选项允许“时间”实用程序将信息附加到文件 FILE 而不是覆盖它。

运行“time”命令时,它给出的输出类型如下:

# /usr/bin/time ls
anaconda-ks.cfg  bin  install.log  install.log.syslog  mbox
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3888maxresident)k
0inputs+0outputs (0major+304minor)pagefaults 0swaps

正如我们在上面看到的,除了执行命令之外,输出的最后两行是’time’命令输出的资源信息。

注意:在上面的示例中,“时间”命令在没有任何选项的情况下运行。所以这是“time”命令生成的默认输出,格式不正确。

从输出中我们可以看到,生成的输出的默认格式是:

%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k
%Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps

格式选项

此选项允许用户决定由“time”命令生成的输出。在上一节中,我们讨论了输出中使用的默认格式。在本节中,我们将学习如何指定自定义格式。

格式字符串通常由散布在纯文本中的“资源说明符”组成。格式字符串中的百分号 (`%’) 导致后面的字符被解释为资源说明符。

反斜杠 (`\’) 引入了“反斜杠转义”,在输出时将其转换为单个打印字符。`\t’ 输出制表符,`\n’ 输出换行符,`\\’ 输出反斜杠。后跟任何其他字符的反斜杠会输出一个问号 (`?’),后跟一个反斜杠,表示给出了无效的反斜杠转义。

格式字符串中的其他文本被逐字复制到输出中。time 在打印资源使用信息后总是打印换行符,因此通常格式字符串不以换行符(或 `0)结尾。

例如 :

$ /usr/bin/time -f "\t%U user,\t%S system,\t%x status" date
Sun Jan 22 17:46:58 IST 2012
	0.00 user,	0.00 system,	0 status

所以我们看到在上面的例子中,我们试图通过使用不同的输出格式来改变输出格式。

资源

由于我们在上面讨论了“time”实用程序显示有关程序资源使用情况的信息,因此在本节中,我们列出该实用程序可以跟踪的资源和相应的说明符。

从手册页:

  • C – 正在计时的命令的名称和命令行参数。
  • D – 进程的非共享数据区域的平均大小,以千字节为单位。
  • E – 进程使用的实际(挂钟)时间,以 [小时:] 分钟:秒为单位。
  • F – 进程运行时发生的主要或需要 I/O 的页面错误数。这些是页面实际迁移出主内存的错误。
  • I – 进程的文件系统输入数。
  • K – 进程的平均总(数据+堆栈+文本)内存使用量,以千字节为单位。
  • M – 进程在其生命周期内的最大驻留集大小,以千字节为单位。
  • O – 进程的文件系统输出数。
  • P – 该作业获得的 CPU 百分比。这只是用户 + 系统时间除以总运行时间。它还打印一个百分号。
  • R – 次要或可恢复的页面错误数。这些页面无效(因此它们出错)但尚未被其他虚拟页面声明。因此页面中的数据仍然有效,但必须更新系统表。
  • S – 系统代表进程(在内核模式下)使用的 CPU 秒总数,以秒为单位。
  • U – 进程直接使用的 CPU 秒数(在用户模式下),以秒为单位。
  • W – 进程从主内存中换出的次数。
  • X – 进程中共享文本的平均数量,以千字节为单位。
  • Z – 系统的页面大小,以字节为单位。这是每个系统的常数,但因系统而异。
  • c – 进程非自愿上下文切换的次数(因为时间片已过期)。
  • e – 进程使用的实际(挂钟)时间,以秒为单位。
  • k –传递给进程的信号数。
  • p – 进程的平均非共享堆栈大小,以千字节为单位。
  • r – 进程收到的套接字消息数。
  • s – 进程发送的套接字消息数。
  • t – 进程的平均驻留集大小,以千字节为单位。
  • w – 程序自愿进行上下文切换的次数,例如在等待 I/O 操作完成时。
  • x – 命令的退出状态。

所以我们可以看到有一长串资源可以通过“时间”实用程序跟踪其使用情况。

为什么是 /usr/bin/time?(而不仅仅是时间)

让我们不要使用 /usr/bin/time 而是使用“time”。

$ time -f "\t%U user,\t%S system,\t%x status" date
-f: command not found 

real	0m0.255s
user	0m0.230s
sys	0m0.030s

从上面的输出中可以看出,在没有完整路径 (/usr/bin/time) 的情况下使用“时间”命令时会吐出关于“-f”标志的错误。此外,输出的格式既不是我们在命令中指定的格式,也不是我们之前讨论的默认格式。这导致对如何生成此输出的混淆。

如果在没有完整路径 (/usr/bin/time) 的情况下执行“时间”命令,则执行 bash shell 的内置“时间”命令。

  • 使用 ‘man time’ 查看 /usr/bin/time 的手册页
  • 使用“帮助时间”查看内置的 bash 时间信息。

链接:https://bbs.huaweicloud.com/blogs/355148

今日福利

秒懂 Linux time 命令:性能调优必备技能!插图1
添加图片注释,不超过 140 字(可选)
秒懂 Linux time 命令:性能调优必备技能!插图2

扫码即可参与

仅限前200名

本文链接:https://www.yunweipai.com/46886.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部