【问题标题】:Correlating dtrace probes关联 dtrace 探针
【发布时间】:2019-08-24 20:41:34
【问题描述】:

我使用 dtrace 看到了意想不到的结果,因为我的 -entry-return 结果似乎并不总是相关的,我似乎看到太多或太少,并简化了我的脚本来探索什么出错了。

我正在尝试使用以下 D 脚本在我的 Ruby 代码中分析 require "./foo"s 中花费的时间:

ruby*:::require-entry
{
  self->start = timestamp;
  @counts["require-entry"] = count();
}

ruby*:::require-return
/self->start/
{
  @counts["correlated require returns"] = count();
  self->start = 0;
}

ruby*:::require-return
/!self->start/
{
  /* @reqTimes[copyinstr(arg0)] = quantize(self->start - timestamp); */
  @counts["uncorrelated require returns"] = count();
}

运行此打印:

$ time sudo dtrace -q -s script.d -c './script.rb'

  correlated require returns                                     5691
  uncorrelated require returns                                   7872
  require-entry                                                  7877
sudo dtrace -q -s script.d -c './script.rb'  0.22s user 0.22s system 3% cpu 13.488 total
  • 我是否正确使用了self-> 变量(与this-> 或类似变量相比?)
  • 我的谓词正确吗?
  • 以这种方式运行 dtrace 时,我是否会与在脚本启动之前激活的探针“竞争”?

【问题讨论】:

标签: ruby macos dtrace


【解决方案1】:

我是否正确使用了 self-> 变量

可能不会。因为第三个子句将始终运行 (self->start=0)。这就是问题所在。

如果你有足够新的 (dtrace -Vdtrace: Sun D 1.14) dtrace 版本,你可以这样做

ruby*:::require-return
{
  if (self->start)
    @counts["correlated require returns"] = count();
  else
    @counts["uncorrelated require returns"] = count();

  self->start = 0;
}

否则

ruby*:::require-return
{
  @counts[self->start ? "correlated require returns" : "uncorrelated require returns"] = count();
  self->start = 0;
}

也会成功的。

【讨论】:

  • 谢谢,我会再去挖掘一下,看看我能找到什么——我有一段时间没有接触这个项目了,需要刷新我的记忆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多