2011-11-25 37 views
5

我正在寻找一种方法来检索有关在程序执行过程中如何完成调度的信息:哪些进程在哪些调度程序中,如果它们发生更改,哪些进程在每个调度程序中处于活动状态,调度程序运行在一个核心等...Erlang VM:调度程序运行时信息

任何想法或相关文档/文章/任何东西?

回答

5

我建议你采取以下追踪/分析选项一看:

erlang:system_profile/2

它有监控调度和运行队列(runnable_procs)的活动方案。 调度选项将报告

{profile, scheduler, Id, State, NoScheds, Ts} 

是:国家会告诉你,如果它处于活动状态。 NoScheds报告当前活动调度程序的数量(如果我没有记错的话)。

runnable_procs选项会让您知道是否将某个进程放入特定调度程序的运行队列或从该特定调度程序的运行队列中移除。

+0

谢谢!我有R14A,它总是返回undefined,但我升级到R14B04,它现在工作正常:D – raymond

+0

当它在运行队列上时,它不仅在实际运行时处于活动状态,对吧? – raymond

+0

是的,它在运行时(在运行队列中)或实际运行时都被视为活动,否则被视为活动。 – psyeugenic

4

如果您的系统支持DTrace,则可以使用正在开发的erlang dtrace探针来准确查看进程调度事件的发生时间。

例如,我写了一个simple one-liner表示你,将消息发送到一个进程和具有该接收进程被调度执行(±跨核心时钟方差和进程,几个纳秒之间通过纳秒数这样)。

+0

我喜欢dtrace,太糟糕了,它只适用于mac和solaris(以及其他一些),但不适用于linux。 @Dustin,在erlang/dtrace impl上做的很好。 – psyeugenic

+0

systemtap做同样的东西的作品。您始终可以使用非Linux或Windows的东西来研究事物的工作方式,然后将这些知识应用到Linux部署中。 – Dustin

+0

有趣,我一定会检查DTrace/SystemTrap! – raymond