聚集统计

聚集实例用来收集有关数值的统计信息,可以快速大量的积累新数据。这些操作不需要排它锁,存储在流式统计上。聚合操作只用于 global 变量上。它们独立存储,或者当成数组的元素。

把值添加到聚集统计上,使用操作符 <<< value 。 这个操作符很像 C++ 的流操作符。左值为独立的变量或者是数组的关联元素,右值是数值型表达式。有提取函数可以获得统计信息的值。

a <<< delta_timestamp
writes[execname()] <<< count

提取函数

使用格式 @extractor(variable/array index expression) 可以提取统计信息数据。extractor 有下面几个操作:

  • count 统计信息中存储不同值的值的数量。

  • sum 统计信息中存储的所有值的和

  • min 统计信息中所有值中最小值

  • max 统计信息中所有值中最大值

  • avg 统计信息中所有值的平均值

可以使用数组多元组存储统计信息,多元组可以统计额外的上下文信息。元组的个数最多为5个。举例如下:

    global reads
    probe vfs.read
    {
      reads[execname(),pid()] <<< 1
    }
    probe timer.s(3)
    {
      foreach([var1,var2] in reads)
        printf("%s (%d) : %d \n", var1, var2, @count(reads[var1,var2]))
    }

第一个 probe 记录了每个进程执行了多少次 read 操作,不光记录了进程名称,还把进程ID也记录下来。第二个 probe 每隔 3s 进行打印,把进程名称,进程ID,执行 read 次数都打印出来。

results matching ""

    No results matching ""