Erlang调度器一窥

Erlang R15的一项新特性是可以通过DTrace或Systemtap跟踪虚拟机中的各种行为(参见 http://blog.yufeng.info/archives/2198)。通过这些跟踪信息可以从旁观者的角度窥探到Erlang的工作原理。

编写了一个小程序,把跟踪信息画出来,如下图所示。这个跟踪的跟踪对象是一个名为random的benchmark程序。random创建出N个进程,每个进程随机生成100000个整数,然后对这些整数进行排序,再将排序后的列表分为两半,将第二半的第一个数,即整个整数列表的中位数,通过消息发送给主进程。很明显这是一个并行度为N的计算密集型任务,每一个并行任务之间没有任何依赖性。这个跟踪在一个8核机器上创建了9个计算进程。如图所示,横轴上的数字表示自程序开始运行的时间,纵轴的数字表示处理器内核的编号,除了最后一行之外每一行表示一个处理器核心上的进程运行情况。

从图中可以看出,处理器1上创建出了9个进程,然后有7个进程分别被调度器迁移到了其他7个处理器上。剩下的两个进程在处理器1上round robin调度。处理器7执行完了唯一的进程之后,从处理器1上窃取了一个进程。处理器1继续执行剩下的那个进程。处理器7上执行的这个进程之后又被迁移到了处理器0上。这个图缩小了很多倍适合一个屏幕显示,其实每一个处理器上的进程执行被切断为很多时间片(也就是reduction片),只不过缩小了之后看不出来时间片之间的调度器开销了。放大的片段如下图所示:

从中可以看出在处理器1上两个进程的交替执行。色块和色块之间的白色间隙就是调度的开销。

posted @ 2012-06-12 22:46  siyao  阅读(1583)  评论(0编辑  收藏  举报