Коррелирующие датчики трассировки - PullRequest
1 голос
/ 03 апреля 2019

Я вижу неожиданные результаты при использовании dtrace, поскольку мои -entry и -return результаты не всегда коррелируют, я вижу слишком много или слишком мало и упростил свой сценарий, чтобы изучить, чтоидет не так.

Я пытаюсь профилировать количество времени, потраченного в require "./foo" с в моем коде Ruby, используя следующий сценарий D:

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таким образом, я "гоняюсь" против зондов, активирующихся до запуска скрипта?

1 Ответ

0 голосов
/ 11 июня 2019

правильно ли я использую переменные 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;
}

будетсделать тоже самое.

...