delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

28 Oct 2006

KSE成为内核选项

今天,John Birrell同学commit了一个不大不小的patchset—-将KSE变为内核选项。具体说来,在-CURRENT上,KSE不再是一个必选项了。

KSE是FreeBSD 5.0-CURRENT时的一个非常重要的技术探索,它是对由华盛顿大学THOMAS E. ANDERSON等人提出的调度器激活概念的一个实现。

对于M:N线程来说,调度器激活是一项十分先进的概念。在这个模型中,内核并不需要了解用户态线程的细节,而用户态线程也并不是由内核直接调度,相反,这些线程被绑定到一系列"调度实体"上,内核能够看到这些调度实体,并在上下文切换时激活用户态的线程调度器。由于减少了内核-用户态的上下文切换操作,因此理论上这一模型能够获得更好的性能。

然而不幸的是,M:N线程模型并没有被许多程序员所接受。一方面,实现用户态的调度器,以及相关的同步-互斥设施并不是一件轻松的工作,另一方面,想要成功地利用M:N线程的优越性,程序设计人员需要仔细地思考如何合理地分配调度实体,以避免由于不正确设计导致的延迟等问题。举例而言,MySQL不但没有采用正确的设计,反而将错就错地利用线程调度的一些特性来进行所谓的"优化",使得它在包括Solaris在内的许多系统上都无法发挥良好的性能。

近期的Solaris版本中,由于包括前面的这些原因在内的各式各样的原因不再推荐使用M:N线程,转而大力推广1:1线程。目前看来,市场的趋势也是1:1线程将占据绝对的支配地位,而另一方面,在不使用M:N线程时,这一复杂机制所带来的开销是得不偿失的,此外,由于实现KSE的MD部分的复杂性,也给FreeBSD向其他硬件平台的移植带来了困难。目前,在Sun SPARC T1 (“sun4v”)平台上,短期内没有实现KSE的计划。

然而,作为FreeBSD的一项深入核心的基础设施,想要拿掉KSE并不是一件轻松的事情。经过讨论,最终KSE变为了一个内核选项,与此同时,对3个调度器也进行了一系列的相应调整(David Xu [访谈] 的CORE调度器在这一轮的变动中没有做修改,他将在稍后对其进行进一步的改动以适应此次变动)。在取消KSE之后的内核执行MySQL (1:1线程) supersmack测试的性能有大约7%的提升。目前的修改策略是默认情况下内核无论是否明示,均会编译KSE;如果需要在内核中删去KSE支持,则需要在配置文件中增加nooptions KSE。

此变动目前仅限于FreeBSD 7.0-CURRENT,相信应该暂时没有MFC的计划。