秒懂 Linux time 命令:性能调优必备技能!
链接:https://bbs.huaweicloud.com/blogs/355148
有时您可能希望根据以下参数分析您的程序:程序在用户模式下花费的时间内核模式下程序花费的时间程序的平均内存使用量ETC在 Linux 上,我们有一个专门为此目的设计的实用程序“time”。实用程序“time”将程序名称作为输入并显示有关程序使用的资源的信息。此外,如果命令以非零状态存在,则此实用程序会显示警告消息和退出状态。“time”的语法是:/usr/bin/time [options] ...
有时您可能希望根据以下参数分析您的程序:
-
程序在用户模式下花费的时间
-
内核模式下程序花费的时间
-
程序的平均内存使用量
-
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 时间信息。
秋
招已经开始啦,大家如果不做好充足准备的话,
秋
招很难找到好工作。
送大家一份就业大礼包,大家可以突击一下春招,找个好工作!