时间间隔探针管理器

时间间隔探针管理器提供按用户定义的时间间隔触发的探针点。 探针点不位于内核或应用程序代码中,而是基于以墙上时钟时间间隔为基础的探测事件。

时间间隔探针管理器对于总结一段时间内收集的统计信息十分有用。 它接受以下格式的 4 元组或 5 元组探针规范:

@@interval:*:clock:<# milliseconds>:[*|cpu_ids]

如果在第二个字段中提供进程标识,那么时间间隔探针管理器不会按它过滤探测事件。 将 * 指定给第二个字段表示将为所有进程触发调查。 而且,时间间隔探针管理器为第三个字段支持的唯一值是将调查规范标识为用于时针调查的时针关键字。 The fourth field, that is the <# milliseconds> field, identifies the number of milliseconds between firings of the probe. 时间间隔探针管理器要求此字段的值仅包含 0 到 9 之间的数字。

The fifth field, <cpu_ids> identifies CPU IDs of the CPUs on which the probe occurs. 必须在 CPU 标识或 * 或个别 CPU 标识的范围内指定此字段的值。 第二个元组中指定的进程标识与第五个元组中指定的 CPU 标识互斥。 因此,时间间隔探测器管理器按在任何 CPU 上运行的元组 2 中的指定进程标识来过滤探测器事件,或者过滤在指定 CPU 上运行的所有进程的事件。 受支持的最小时钟值为 100 毫秒。 系统中每个逻辑 CPU 只有一个 CPU 绑定时间间隔探测器。 这是一个可选字段。

对于不包含进程标识的时间间隔调查,时间间隔应该正好可以被 100 整除。 因此,在非概要分析时间间隔调查中,允许相隔 100ms、200ms、300ms 等的探测事件。 对于指定了进程标识的时间间隔调查,它应该大于或等于全局 root 用户所允许的最小时间间隔,或者对其他用户正好可以被 10 整除。 因此,在概要分析时间间隔调查中,对正常用户允许相隔 10ms、20ms、30ms 等的探测事件。 对于某个进程,只能有一个概要分析时间间隔调查可以处于活动状态。

下面列出了 CPU 绑定探测器的时间间隔探测器规范示例:

  1. 要获取上下文信息,请对所有 CPU 运行用户定义的 ProbeVue 子句 (在 cpu_ids 字段中指定 "*" 表示所有 CPU)。
    @@interval:*:clock:100:*
  2. 获取范围在 10 到 20 之间的 CPU 的上下文信息 (指定格式为 x-y ,其中 x=10 和 y=20 表示 CPU 范围)。
    @@interval:*:clock:100:10-20
  3. 获取 CPU 10 和 12 的上下文信息 (使用 "|" (管道) 符号指定用于分隔每个 CPU 标识的格式)。 此格式用于指定多个 CPU 标识。
    @@interval:*:clock:100:10|12
  4. 获取 CPU 10 和 12-20 集合的上下文信息。
    @@interval:*:clock:100:10|12-20
注: 用户可以提供 "*" 或一组 CPUID。
注: 时间间隔探测器管理器不保证将以第四个字段的值所指示的正好相隔毫秒数来触发探测器。 优先级较高的中断和在禁用所有中断后运行的代码将导致调查的触发晚于规定的时间。

时间间隔探针管理器只需要基本的动态跟踪特权。 时间间隔探针管理器对支持的调查数实施以下限制,以防止恶意用户通过创建大量的时间间隔调查来运行内核以耗尽内存。

表 1. 时间间隔探针管理器指定的限制
时间间隔 计数
每个用户时间间隔调查的最大数 32
系统中时间间隔调查的最大数 1024

时间间隔探针管理器不支持以下函数。 如果在时间间隔管理器探针点中使用,那么这些函数还会生成空的字符串或零作为输出。

  • get_function
  • get_probe
  • get_location_point

当没有指定进程标识时,因为探测事件的依据是墙上时钟时间,所以在任何进程的上下文中,时间间隔调查都可根据何时触发调查来进行触发。 因此, ProbeVue 框架不允许在时间间隔探针管理器的操作块中使用以下任何函数,以防止对进程内部数据进行未经授权的访问。 仅在内核中会捕获此安全性违例。 Vue 脚本将成功编译,但会话将无法初始化。

  • stktrace
  • get_userstring

从探针管理器使用这些函数时,它们不会提供任何值。 即使您是 root 用户,您也不能在时间间隔探针管理器中调用这些函数。

指定进程标识时,为所指定时间间隔内进程中的所有线程触发了时间间隔探测器。 因为在进程的上下文中触发探测,所以在时间间隔探针管理器的操作块中允许 stktrace() 函数和 __pname 内置,除非未指定进程标识。

系统跟踪探针管理器

在内核和应用程序中,只要出现跟踪通道零(系统事件通道)的现有系统跟踪挂钩,那么系统跟踪探针管理器就会提供探针点。 要使用此探针管理器,您必须具有内核访问特权,且不是在 WPAR 中运行。

系统跟踪探针管理器接受以下格式的 3 重调查规范:

@@systrace:*:<hookid>

其中,hookid 参数指定相关的特定系统跟踪挂钩的标识。 hookid 参数包括 4 个十六进制数字,其格式通常为 hhh0。 例如,要为 fork 系统调用指定 hookid 自变量,请指定 1390。 请参阅 /usr/include/sys/trchkid.h 文件以获取示例,例如 HKWD_SYSC_FORK。 此文件中的入口是挂钩字,其中 hookid 值以大写半字表示。 由于挂钩字是随意的,因此除了检查 hookid 参数是不是由最多 4 个十六进制数字组成的有效十六进制字符串以外,不会再对它进行任何其他验证。 指定从未出现过的 hookid 值不是错误。

为了方便,您可以指定少于 4 个十六进制数字的 hookid 参数。 在这种情况下,可能会先采用一个尾部零,然后再根据需要加上其他的前置零,以隐式定义所需的 4 位数。 例如,您可以使用 139 作为 1390 的简写。 同样,010001010 都指定从 HKWD_USER1 获取的相同 hookid 值。

您可以使用 * 通配符来指定 hookid 参数。 这将调查具有可能无法接受的性能含义的所有系统跟踪。 因此,仅当绝对必要时才使用此类规范。

如上所示,将保留第二元组且必须将其指定为星号。

只有实际发生且记录系统跟踪数据的系统跟踪事件才会触发调查。 而且,仅当系统跟踪处于活动状态时,才会发生系统跟踪调查。 systrace 探针管理器是基于事件的探针管理器。 因此,调查名称、函数名和位置点都不可用。 当挂钩字传递给脚本时,这不是重要限制。

非 root 用户会限制为同时启用最多 64 个 systrace 调查。 在系统中最多不能启用超过 128 个显式 systrace 调查。

ProbeVue 内置寄存器变量允许访问跟踪的数据。 不能将 __arg* 变量用作此目的。 系统跟踪有两种常见样式。

以下样式用于 trchook(64)/utrchook(64)(或 C 中的等效 TRCHKLx 宏)挂钩:

  • __r3 包含 16 位 hookid。
  • __r4 包含 subhookid。
  • __r5 包含跟踪的数据字 D1。
  • __r6 包含跟踪的数据字 D2。
  • __r7 包含跟踪的数据字 D3。
  • __r8 包含跟踪的数据字 D4。
  • __r9 包含跟踪的数据字 D5。

不是所有的跟踪挂钩都包含这所有 5 个数据字。 来自给定跟踪挂钩的未定义数据字将显示为零。 给定挂钩标识的 Vue 子句必须准确知道其挂钩标识跟踪的数据和数据量。

如果跟踪记录由 trcgen 或 trcgent 系列中的某个函数生成,请使用以下样式:

  • __r3 包含 16 位 hookid。
  • __r4 包含 subhookid。
  • __r5 包含跟踪的数据字 D1。
  • __r6 包含跟踪数据的长度。
  • __r7 包含跟踪数据的地址。

以下脚本显示了 systrace 探针管理器的简单示例:

	@@systrace:*:1390
	{
		if (__r4 == 0) {	/* normal fork is traced with subhookid zero */
			printf(“HKWD_SYSC_FORK: %d forks child %d\n”, __pid, __r5);
			exit();
		}
	}

Systrace 探针管理器独立于系统跟踪功能,即使系统跟踪功能未处于活动状态,也可以跟踪挂钩位置。 当 ProbeVue 会话处于活动状态时,可以开启系统跟踪功能。

Systrace 探测器管理器使用 AIX® 操作系统内核来简化其部分构造。 ProbeVue 当前使用的跟踪挂钩将对 AIX 可靠性产生负面影响。 因此,当您跟踪此类挂钩标识时,无法使用某些 ProbeVue 构造。 下表显示了构造的异常:
注: 如果要使用 @@systrace:*:* 规范来跟踪所有挂钩,那么将忽略以下构造。 如果 AIX 内核禁止在挂钩所在的环境中生成异常,那么您可能无法显示堆栈跟踪。 ProbeVue 显示堆栈跟踪的能力是在运行时确定的。
表 2。 Trace-hook 构造
编号 跟踪-挂钩 构造
1 HKWD_KERN_HCALL 全部
2 HKWD_KERN_SLIH 关联数组,范围, stktrace 变量, __stat
3 HKWD_KERN_LOCK 关联数组,范围, stktrace 变量, __stat
4 HKWD_KERN_UNLOCK 关联数组,范围, stktrace 变量, __stat
5 HKWD_KERN_DISABLEMENT 全部
6 HKWD_KERN_DISPATCH __ublock , stktrace , get_stktrace , __pname , __execname 和 __errno
7 HKWD_KERN_DISPATCH_SRAD __ublock , stktrace , get_stktrace , __pname , __execname 和 __errno
8 HKWD_KERN_DISP_协进 __ublock , stktrace , get_stktrace , __pname , __execname 和 __errno
9 HKWD_KERN_UNDISP __ublock , stktrace , get_stktrace , __pname , __execname 和 __errno
10 HKWD_KERN_IDLE __ublock , stktrace , get_stktrace , __pname , __execname 和 __errno
11 HKWD_KERN_FLIH 关联数组,范围, stktrace 变量, __stat
12 HKWD_KERN_RESUME 关联数组,范围, stktrace 变量, __stat
13 HKWD_KERN_VPM 关联数组,范围, stktrace 变量, __stat
14 HKWD_PM_NOTIFY 关联数组,范围, stktrace 变量, __stat
使用相应的特权, Vue 脚本可以使用可靠性,可用性和可维护性 (RAS) 事件 Vue 函数来生成系统跟踪记录。 但是, Systrace 探测器管理器不会检测从 Vue 脚本生成的跟踪记录。