维护带有大量线程的Java应用程序时,我需要了解什么?
|
背景资料
我有一个进行数据分析的分布式处理应用程序。它旨在并行处理实时更新的许多数据集。作为设计的一部分,分析已分解为分析节点。每个节点获取源数据并对其进行处理以创建其他数据,然后其他节点可以使用这些数据。要对一个数据集进行当前的全套分析,需要大约200个节点。
在当前设计中,每个节点都使用自己的线程运行。现在,大多数时间这些线程都处于睡眠状态。每当数据更新时,它们依次将它们唤醒,就像瀑布一样,然后回到睡眠状态。该应用程序目前正在生产中,使用8000个线程运行40组数据,每组数据需要200个节点。当没有数据进入时,服务器上没有负载。当数据最繁忙时,服务器的CPU峰值将达到25%。这些都在项目的设计和生产参数之内。
现在进行下一步,我们将40组数据缩放到200个。每个组需要200个节点,这意味着总共40000个节点,即40000个线程。这超出了我们服务器的最大PID,因此我要求我们的服务器管理员提高上限。他们做到了,应用程序工作了,但是他们给了我一些关于线程数量的回推。我并不是否认线程数是不寻常的,但是在我们设计的这一阶段,这是预期的和必要的。
我正在计划对设计进行一些细微调整,以将线程与节点分离。这将使我们能够配置一个线程来运行多个节点,并减少线程数。对于不经常更新的数据集,只有一个线程在每个节点中执行数据更新对性能的影响很小。对于每秒更新数百次的数据集,我们可以将每个节点配置为在自己的线程上运行。实际上,我毫不怀疑会进行这种设计更改,这只是时间的问题。同时,我希望获得尽可能多的信息,以了解使用这种设计的后果。
题
一台计算机上运行40,000个线程以上的成本是多少?让JVM / Linux OS管理这么多线程会使我失去多少性能?请记住,它们都已正确配置为在没有工作时可以进入睡眠状态。因此,我只是在谈论额外的开销和由数量庞大的线程引起的问题。
请注意-我知道我可以减少线程数,并且我知道进行此设计更改是个好主意。我会尽快进行,但必须与其他工作和设计考虑因素进行权衡。我问这个问题是为了收集信息,以便做出正确的决定。非常感谢您对这种性质的想法和评论。
没有找到相关结果
已邀请:
2 个回复
目浆搽
慰泥悍瓶