跳过导航链接 | |
退出打印视图 | |
手册页第 1 部分:用户命令 Oracle Solaris 11 Information Library (简体中文) |
- 使用 CPU 性能计数器监视进程和 LWP 行为
cputrack -c eventspec [-c eventspec]... [-efntvD] [-N count] [-o pathname] [-T interval] command [args]
cputrack -c eventspec [-c eventspec]... -p pid [-efntvD] [-N count] [-o pathname] [-T interval]
cputrack -h
通过 cputrack 实用程序,可使用 CPU 性能计数器监视系统上运行的一个或一系列进程的行为。如果使用 -T 选项指定 interval,cputrack 会每隔 interval 秒对活动进行一次抽样并一直重复。如果使用 -N 选项指定 count,则会对跟踪的每个进程重复统计 count 次信息。如果未指定任何参数,将使用一秒钟的间隔。如果指定 command 和可选 args,cputrack 会在监视指定的 CPU 性能事件时运行带有给定参数的命令。此外,可以使用 -p 选项指定现有进程的进程 ID。
因为 cputrack 是非特权程序,所以它遵循适用于 truss(1) 的相同限制。例如,无法跟踪 setuid(2) 可执行程序。
支持下列选项:
指定一组 CPU 性能计数器要监视的事件。这些事件规范的语法为:
[picn=]eventn[,attr[n][=val]][,[picn=]eventn [,attr[n][=val]],...,]
您可以使用 -h 选项获取可用事件和属性的列表。这会导致生成用法消息。可以不必显式分配计数器,这时 cpustat 会自动尝试选择适用的计数器。
可以按适合 strtoll(3C) 的格式以十六进制、八进制或十进制表示法表示属性值。事件规范中存在的没有显式值的属性会收到缺省值 1。没有相应计数器编号的属性将应用到规范中的所有计数器。
可通过阅读 CPU 制造商的事件文档来确定这些事件规范的语义。
可以指定多个 -c 选项,这时 cputrack 会在每个样例上的不同事件设置之间循环。
启用调试模式。
显示一条详细帮助消息,说明如何使用实用程序、如何对依赖处理器的计数器进行编程以及从何处可以找到更多详细信息。
省略所有文件头输出(在 cputrack 位于流水线的开头时很有用)。
指定在退出之前可以采集的最大 CPU 性能计数器样例数。
指定要用于 cputrack 输出的文件。
将该参数解释为应附加和监视进程计数器上下文的现有进程的进程 ID。
显示处理器周期计数的附加列(如果在当前体系结构中可用)。
指定 CPU 性能计数器抽样之间的间隔(以秒为单位)。间隔太小可能会导致某些样例被跳过。请参见“警告”。
启用更详细的输出。
操作系统会在跟踪进程时强制使用某些限制。特别是,用户无法跟踪自己无法读取其对象文件的命令;set-uid 和 set-gid 命令仅可由特权用户进行跟踪。除非由特权用户运行,否则 cputrack 会失去对 set-id 或不可读对象文件执行 exec() 的任何进程的控制权。此类进程通常会从 exec() 出发继续执行,而不考虑 cputrack。
在使用 -f 选项时,系统可能用完每个用户的进程槽,因为 cputrack 会为每个被跟踪的进程运行一个控制进程。
当硬件计数器是实际样例时,cputrack 所显示的时间对应于墙上时钟时间。从与 gethrtime(3C) 相同的时基派生时间。
cputrack 实用程序会将性能计数器上下文附加到它所检查的每个进程。通过此上下文,可在系统上的不同进程之间复用性能计数器,但不能将其与 cpustat(1M) 实用程序同时使用。
若 cpustat 实用程序的某个实例正在运行中,则进一步运行 cputrack 的尝试将失败,直到所有 cpustat 实例终止为止。
有时,cputrack 会非常灵活并显示足够的统计信息,如此可不必将监测代码添加到应用程序中。但是,有时需要更多控制。因为应用程序本身和由 cputrack 注入到应用程序中的代理 LWP 使用相同的性能计数器上下文,所以应用程序可能会与计数器上下文进行交互以实现某些值得关注的功能。请参见 cpc_enable(3CPC)。
通过 -t 选项启用的处理器周期计数始终适用于用户模式和系统模式,无论应用于性能计数器寄存器的设置为何。
根据设计,通过 nawk(1) 和 perl(1) 可以很容易地解析 cputrack 的输出,从而允许通过在脚本中嵌入 cputrack 来构建性能工具。此外,也可以使用构建 cputrack 所依据的同一 API 或使用 libcpc(3LIB) 和 libpctx(3LIB) 的功能直接构造这些工具。请参见 cpc(3CPC)。
虽然 cputrack 使用性能计数器上下文来维护每个 LWP 的各个性能计数器值,但某些可以计数的事件会不可避免地受到系统上发生的其他活动的影响,尤其是进程间共享的受限资源(例如,高速缓存未命中率)。对于此类事件,使用 cpustat(1M) 监测整体系统行为也可能会很值得关注。
对于 -T interval 选项,如果将 interval 指定为零,则不会执行定期抽样。仅当进程创建或销毁 LWP 或者调用 fork(2)、exec(2) 或 exit(2) 时,才对性能计数器进行抽样。
示例 1 使用性能计数器对时钟周期进行计数
在本示例中,将在包含 UltraSPARC-III+ 处理器的计算机上使用该实用程序。计数器被设置为对处理器时钟周期和运行 sleep(1) 命令时在用户模式中分发的指令进行计数。
example% cputrack –c pic0=Cycle_cnt,pic1=Instr_cnt sleep 10 time lwp event pic0 pic1 1.007 1 tick 765308 219233 2.007 1 tick 0 0 4.017 1 tick 0 0 6.007 1 tick 0 0 8.007 1 tick 0 0 10.007 1 tick 0 0 10.017 1 exit 844703 228058
示例 2 对外部高速缓存引用和未命中进行计数
本示例显示了在 UltraSPARC 计算机上执行简单 shell 脚本的 fork() 和 exec() 时的更详细输出。计数器正在测量外部高速缓存引用和外部高速缓存未命中的数量。请注意,在没有歧义的情况下可以不必显式指定 pic0 和 pic1 名称。
example% cputrack –fev –c EC_ref,EC_hit /bin/ulimit –c time pid lwp event pic0 pic1 0.007 101142 1 init_lwp 805286 20023 0.023 101142 1 fork # 101143 0.026 101143 1 init_lwp 1015382 24461 0.029 101143 1 fini_lwp 1025546 25074 0.029 101143 1 exec 1025546 25074 0.000 101143 1 exec \ # '/usr/bin/sh /usr/bin/basename\ /bin/ulimit' 0.039 101143 1 init_lwp 1025546 25074 0.050 101143 1 fini_lwp 1140482 27806 0.050 101143 1 exec 1140482 27806 0.000 101143 1 exec # '/usr/bin/expr \ //bin/ulimit : \(.*[^/]\)/*$ : .*/\(..*\) : \(.*\)$ | //bin/ulimi' 0.059 101143 1 init_lwp 1140482 27806 0.075 101143 1 fini_lwp 1237647 30207 0.075 101143 1 exit 1237647 30207 unlimited 0.081 101142 1 fini_lwp 953383 23814 0.081 101142 1 exit 953383 23814
示例 3 对指令进行计数
本示例显示了为了在 Pentium III 计算机上输出日期在应用程序中和内核中执行的指令数:
example% cputrack –c inst_retired,inst_retired,nouser1,sys1 date time lwp event pic0 pic1 Fri Aug 20 20:03:08 PDT 1999 0.072 1 exit 246725 339666
示例 4 对 TLB 命中进行计数
本示例显示了如何在 Pentium 4 计算机上使用特定于处理器的属性对 TLB 命中进行计数:
example% cputrack -c ITLB_reference,emask=1 date time lwp event pic0 Fri Aug 20 20:03:08 PDT 1999 0.072 1 exit 246725
通过运行 cpustat(1M) 实用程序的任何实例,强行使计算机上的所有现有性能计数器上下文无效。这可能会导致 cputrack 命令的所有调用因未知错误而过早退出。
如果在其 CPU 性能计数器不受 Solaris 支持的系统上调用 cpustat,将显示以下消息:
cputrack: cannot access performance counters - Operation not applicable
此错误消息表明 cpc_open() 已失败且已记录在 cpc_open(3CPC) 中。查看此文档以获取有关该问题及其可能的解决方案的更多信息。
如果请求的时间间隔较短,cputrack 可能无法达到所需的抽样率。在这种情况下,可能会丢弃某些样例。
有关下列属性的描述,请参见 attributes(5):
|
nawk(1)、perl(1)、proc(1)、truss(1)、prstat(1M)、cpustat(1M)、exec(2)、exit(2)、fork(2)、setuid(2)、vfork(2)、gethrtime(3C)、strtoll(3C)、cpc(3CPC)、cpc_bind_pctx(3CPC)、cpc_enable(3CPC)、cpc_open(3CPC)、libcpc(3LIB)、libpctx(3LIB)、proc(4)、attributes(5)