程序员

使用 WITCH 来观察系统的无效处理

2018-05-14  本文已影响910人  siddontang

最近看了一篇 Paper - Watching for Software Inefficiencies with Witch,觉得作者排查性能问题的思路很不错,这里记录一下。

什么是无效处理

对于性能调优来说,我们会关注很多指标,这里,WITCH 主要关注的是系统的 infficiencies,也就是无效的处理。通常的无效处理可能包括:

大家都知道,无效处理会对系统性能造成影响,我们需要尽量避免。虽然现在编译器在很多时候都能对代码做很多优化,但仅仅靠编译器是不够的,我们还需要其他的方法来检查发现系统无效处理的地方。

WITCH 的设计与实现

要排查系统性能问题,对我来说,最先想到的就是使用 perf 这类型的工具,但无论是 perf 还是 vtune,它们都是基于采样的,是一种 Coarse-grained profiler,虽然对系统影响较小,但并不精确,在一些情况下面其实并不能很好的发现无效处理。

另一种就是 Fine-grained profiler,譬如 DeadSpy,它们会详细的分析动态指令,从而发现无效处理,但也会给系统造成非常大的负担,是的系统性能下降。

而对于 WITCH 来说,它融合了 Coarse-grained 和 Find-grained,核心想法就是先用 PUMs 对系统进行采样,然后使用 hardware debug registers 来给采样的地址加上断点,当后续系统访问到这些地址的时候,触发对应的判断程序,看是否是无效处理。

WITCH 的原理非常简单,但要做好,其实还需要处理很多问题。在继续开始之前,我们可以先简单介绍一下系统调优里面一些背景知识。

常用术语

例子

这里我们用 WITCH 的 DeadCraft 来说明下 WITCH 是如何工作的,DeadCraft 主要是用来检查 dead store。所谓 dead store,就是当我们给一个地址设置了一个值,然后马上又用一个新的值在同样的地址设置了,那么这个就是 dead store。如果我们设置了一个值,但后面马上就 load 读取了,这个就不是 dead store。

上面是 WITCH 用来检查 dead store 的流程:

  1. PMU store event 的计数器溢出,触发中断
  2. WITCH 捕获到了信号,得到 calling context C-watch 以及地址 M,跟 AccessType 合成一个 tuple <C-watch, M, AccessType> 发送给 DeadCraft
  3. DeadCraft 让 WITCH 去监控后续对地址 M 的 load 或者 store
  4. WITCH 给设置一个 RW_TRAP 的 watchpoint
  5. 后续程序访问到 M,watchpoint 捕获
  6. WITCH 处理,得到 calling context C-trap,并且将 <C-trap, M, AccessType> 给 DeadCraft
  7. 如果 AccessType 是 store,那么 DeadCraft 就认为这个是一个 dead store,并且将这次 dead store 设置为 <C-watch, C-trap>

实现

上面说到了 WITCH 一个简单的例子,这里说下 WITCH 是如何实现的, WITCH 主要是基于 HPCToolkit,主要有:

挑战

上面整个流程看起来是很简单,但实际还是有很多困难需要克服的,最大的困难就是采样其实并不是精确的。譬如如下的例子:

1: for (int i = 1; i <= 100K; i++) {
2:  arrya[i] = 0;
3: }
4: for (int j = 1; j <= 100K; j++) {
5:  arrya[j] = j;
6: }

假设采样周期是 10K,我们就只有一个 hardware debug register,那么 WITCH 会在第一个 array[10K] 的时候设置一个 watchpoint,然后在 array[20K] 会有第二次采样,但这时候已经没有空间设置 watchpoint 了。

如果采用最通常的做法,后面的替换掉最老的,这个是不能工作的。譬如当我们在第一个循环最后 array[100K] 设置了 watchpoint 之后,下一个在第二个循环 array[10K] 会覆盖掉之前的,但这时候其实是没法发现 dead store 的。为了解决这个问题,WITCH 引入概率机制来决定对于某一次采样,是否需要设置 watchpoint。

假设系统有 N 个 debug register,对于第 k 次采样,k > N,按照 N / k 的概率替换掉 N 里面的一个 watchpoint。也就是说,任何采样都有 N / k 的概率来被监控到。只要 watchpoint 被处罚,概率就被重置为 1。具体的推导可以详细参考 paper。当然,paper 里面还说了其他很多的困难,这里就不一一说明了。

小结

总的来说,WITCH 的思路还是挺不错的,Paper 作者也通过它来找到了一些软件中的无效处理。我也在 Github 上面找到了 WITCH ,本来想试试,看能不能找找 TiKV 中的无效处理,但一看安装说明,需要装一个定制版本的 Linux,就只好先打消了这个念头,后面在尝试吧。如果你对这块很感兴趣,想在 TiKV 里面试试,欢迎联系我 tl@pingcap.com

上一篇 下一篇

猜你喜欢

热点阅读