【发布时间】:2011-08-08 15:16:55
【问题描述】:
背景信息
我有一个进行数据分析的分布式处理应用程序。它旨在对实时更新的多组数据进行并行处理。作为设计的一部分,分析被分解为分析节点。每个节点获取源数据并对其进行处理以创建其他数据,然后这些数据又可以被其他节点使用。要对一个数据集进行我们目前的全套分析,需要大约 200 个节点。
在当前设计中,每个节点都使用自己的线程运行。现在,大多数时候这些线程都处于休眠状态。每当数据更新时,它们就会像瀑布一样依次唤醒每个人,然后又重新进入睡眠状态。该应用程序目前在生产中运行 40 组数据,每组需要 200 个节点,使用 8000 个线程。当没有数据进来时,服务器上没有负载。当数据在最繁忙的时候进来时,服务器会飙升到大约 25% 的 CPU。这一切都在项目的设计和生产参数范围内。
现在下一步,我们将 40 组数据扩展到 200 个。每组需要 200 个节点,这意味着总共有 40000 个节点,即 40000 个线程。这超过了我们服务器的最大 PID,所以我要求我们的服务器管理员增加上限。他们做到了,应用程序工作正常,但他们给了我一些关于线程数量的回击。我不否认线程数不寻常,但这是我们设计阶段的预期和保证。
我正在计划对设计进行一些小的调整,以将线程与节点分开。这将允许我们配置一个线程来运行多个节点,并减少我们的线程数。对于不经常更新的数据集,让一个线程在每个节点中执行数据更新对性能的影响很小。对于每秒更新数百次的数据集,我们可以将每个节点配置为在自己的线程上运行。事实上,我不怀疑这种设计改变会发生——这只是时间问题。同时,我想尽可能多地了解使用此设计的后果。
问题
在一台机器上运行超过 40,000 个线程的成本是多少?让 JVM / Linux 操作系统管理这么多线程,我损失了多少性能?请记住,它们都已正确配置为在没有工作时休眠。所以,我只是在谈论额外的开销和由大量线程引起的问题。
请注意 - 我知道我可以减少线程数,而且我知道进行这种设计更改是个好主意。我会尽快完成,但必须与其他工作和设计考虑因素相平衡。我问这个问题是为了收集信息以便做出正确的决定。非常感谢您对这种性质的想法和看法。
【问题讨论】:
标签: java multithreading performance optimization