Haskell轻量级线程的开销及在多核上的使用

59
我一直在阅读《Real World Haskell》这本书,其中有一个关于并发和并行的章节。我的问题如下:
1. 由于Haskell线程实际上只是一个"真实"操作系统线程中的多个"虚拟"线程,这是否意味着创建大量线程(如1000个)将不会对性能产生重大影响?换句话说,我们可以说使用forkIO函数创建Haskell线程所产生的开销(几乎)可以忽略不计吗?请提供实际例子。
2. 轻量级线程的概念难道不会阻止我们使用多核架构的优势吗?据我理解,两个Haskell线程不能在两个不同的CPU核心上同时执行,因为从操作系统的角度来看,它们实际上是一个单一的线程。或者Haskell运行时有一些巧妙的技巧来确保可以利用多个CPU吗?

1
请参阅https://dev59.com/LHA75IYBdhLWcg3w3NFe。 - Don Stewart
还有 https://dev59.com/2nI-5IYBdhLWcg3wTWf4#1925211 - Don Stewart
3个回答

86

GHC的运行时提供了一个执行环境,支持数十亿的火花和成千上万个轻量级线程,这些线程可以分布在多个硬件核心上。使用-threaded编译,并使用+RTS -N4标志来设置所需的核心数。

sparks/threads/workers/cores

具体来说:

这是否意味着创建很多线程(例如1000个)不会对性能产生巨大影响?

嗯,创建100万个线程肯定是可能的。1000个是如此便宜,甚至不会显示出来。您可以在线程创建基准测试中看到,例如“线程环”,GHC非常非常好

轻量级线程的概念难道不会阻止我们使用多核架构的优势吗?

完全不是这样。自2004年以来,GHC一直在多核上运行。多核运行时的当前状态在此处跟踪

它是如何做到的?了解这种架构的最佳地点是论文“为多核Haskell提供运行时支持”:

GHC运行时系统通过将数百万轻量级线程复用到少量操作系统线程上(大约每个物理CPU一个)来支持线程。...
Haskell线程由一组操作系统线程执行,我们称之为工作线程。我们大致维护每个物理CPU一个工作线程,但是哪个工作线程可能会随时变化...
由于工作线程可能会发生更改,因此我们为每个CPU维护一个Haskell执行上下文(HEC)。 HEC是一个数据结构,包含所有操作系统工作线程执行Haskell线程所需的数据。
您可以通过threadscope监视创建的线程及其执行位置。例如,在运行binary-trees基准测试时:

threadscope


非常感谢您提供的全面答案,特别是提供了关于多核Haskell的论文参考。 - user500944

14
  • Warp web服务器广泛使用这些轻量级线程来实现非常好的性能。请注意,其他Haskell Web服务器也表现出色:这更多是“Haskell很好”而不是“Warp很好”。

  • Haskell提供了一个多线程运行时,可以将轻量级线程分配到多个系统线程中。它在4个核心以下非常有效。在此之后,会有一些性能问题,但正在积极解决。


3
你提到了在使用超过4个核心时性能问题,你有任何相关参考资料吗? - Roman Cheplyaka
1
我有点怀疑。例如,可以在Simon最近的论文中看到加速效果:http://i.imgur.com/rWb7l.png -- 从这个.pdf文件http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/monad-par.pdf--类似的结果在并发集合和数据并行论文中也有报道(将某些问题扩展到32或48核心)。 - Don Stewart
8
我相信Michael所指的问题是IO管理器的架构不适合在几个核心之外进行扩展。特别是它可能应该使用每个核心一个IO管理线程。因此,这不是运行时问题,也不影响CPU密集型工作负载的伸缩性,但是IO密集型应用程序(如Web服务器)可能会遇到瓶颈。就我所知,目前还没有进行彻底分析。 - Simon Marlow
2
是的,Snap也遇到了这个问题。最近已经有所改善,但似乎仍然在大约5或6个线程后掉队。上次我进行基准测试时,Warp的绝对性能比Snap更快,但Snap在4个核心以上的扩展性更好。这可能不足以推断出任何具体的东西,但我觉得很有趣。 - mightybyte
1
今天,随着核心数量增加到4-5个以上,性能下降的现状是什么? - securecurve
显示剩余2条评论

4

创建1000个进程相对轻量级;不用担心。至于性能,您应该进行基准测试。

正如之前指出的,多核心运行得很好。几个Haskell线程可以通过在不同的操作系统线程上安排调度同时运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接