问题描述
我希望通过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 (将#修改为@)