使用DTrace对FreeBSD内核进行性能分析

问题描述

我希望通过FreeBSD缩短接口销毁时间。在运行from scipy.stats import t as tdist def welch_ttest(m1,m2,s1,s2,n1,n2): numerator = m1 - m2 denominator = np.sqrt((s1 ** 2) / n1 + (s2 ** 2) / n2) t = numerator / denominator dof_numerator = ((s1 ** 2) / n1 + (s2 ** 2) / n2) ** 2 dof_denominator = ((s1 ** 4) / (n1 ** 2) / (n1 - 1) + (s2 ** 4) / (n2 ** 2) / (n2 - 1)) dof = dof_numerator / dof_denominator p_half = tdist.cdf(t,dof) if p_half > 0.5: p_final = 2 * (1 - p_half) else: p_final = 2 * p_half return t,p_final # returning t to check the validity of the function 的测试计算机上,销毁数千个接口需要花费几分钟,而且-诚然-我的用例可能是不寻常的,我想了解长时间使用该系统的情况。

根据我的初步观察,我能够确定大部分时间都花在了-CURRENT内部。因此,为了分析此功能,我想出了以下DTrace脚本:

if_detach_internal()

通过挂接#!/usr/sbin/dtrace -s #pragma D option quiet #pragma D option dynvarsize=256m fbt:kernel:if_detach_internal:entry { self->traceme = 1; t[probefunc] = timestamp; } fbt:kernel:if_detach_internal:return { dt = timestamp - t[probefunc]; @ft[probefunc] = sum(dt); t[probefunc] = 0; self->traceme = 0; } fbt:kernel::entry /self->traceme/ { t[probefunc] = timestamp; } fbt:kernel::return /self->traceme/ { dt = timestamp - t[probefunc]; @ft[probefunc] = sum(dt); t[probefunc] = 0; } entry fbt探针,我希望得到return调用的每个函数的函数名称和累积执行时间的列表(无论堆栈深度),然后过滤掉其他任何内容。

但是,我得到的是这样的(破坏了250个接口):

  callout_when                                                   1676
  sched_load                                                     1779
  if_rele                                                        1801
[...]
  rt_unlinkrte                                            10296062843
  sched_switch                                            10408456866
  rt_checkdelroute                                        11562396547
  rn_walktree                                             12404143265
  rib_walk_del                                            12553013469
  if_detach_internal                                      24335505097
  uma_zfree_arg                                        25045046322788
  intr_event_schedule_thread                           58336370701120
  swi_sched                                            83355263713937
  spinlock_enter                                      116681093870088
[...]
  spinlock_exit                                      4492719328120735
  cpu_search_lowest                                 16750701670277714

为至少某些功能命名信息似乎是有道理的,但是我希望if_detach_internal()是列表中的最后一个条目,而花费的时间不会更长,因为该功能位于列表的顶部。我正在尝试分析的调用树。

显然不是这样,因为我也正在用看似疯狂的执行时间来获取其他功能(if_detach_internal()uma_zfree_arg()等)的度量。这些结果完全消除了我对DTrace在这里告诉我的一切一切的信任。

我想念什么?这种方法听起来很合理吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)