维护带有大量线程的Java应用程序时,我需要了解什么?

| 背景资料 我有一个进行数据分析的分布式处理应用程序。它旨在并行处理实时更新的许多数据集。作为设计的一部分,分析已分解为分析节点。每个节点获取源数据并对其进行处理以创建其他数据,然后其他节点可以使用这些数据。要对一个数据集进行当前的全套分析,需要大约200个节点。 在当前设计中,每个节点都使用自己的线程运行。现在,大多数时间这些线程都处于睡眠状态。每当数据更新时,它们依次将它们唤醒,就像瀑布一样,然后回到睡眠状态。该应用程序目前正在生产中,使用8000个线程运行40组数据,每组数据需要200个节点。当没有数据进入时,服务器上没有负载。当数据最繁忙时,服务器的CPU峰值将达到25%。这些都在项目的设计和生产参数之内。 现在进行下一步,我们将40组数据缩放到200个。每个组需要200个节点,这意味着总共40000个节点,即40000个线程。这超出了我们服务器的最大PID,因此我要求我们的服务器管理员提高上限。他们做到了,应用程序工作了,但是他们给了我一些关于线程数量的回推。我并不是否认线程数是不寻常的,但是在我们设计的这一阶段,这是预期的和必要的。 我正在计划对设计进行一些细微调整,以将线程与节点分离。这将使我们能够配置一个线程来运行多个节点,并减少线程数。对于不经常更新的数据集,只有一个线程在每个节点中执行数据更新对性能的影响很小。对于每秒更新数百次的数据集,我们可以将每个节点配置为在自己的线程上运行。实际上,我毫不怀疑会进行这种设计更改,这只是时间的问题。同时,我希望获得尽可能多的信息,以了解使用这种设计的后果。 题 一台计算机上运行40,000个线程以上的成本是多少?让JVM / Linux OS管理这么多线程会使我失去多少性能?请记住,它们都已正确配置为在没有工作时可以进入睡眠状态。因此,我只是在谈论额外的开销和由数量庞大的线程引起的问题。 请注意-我知道我可以减少线程数,并且我知道进行此设计更改是个好主意。我会尽快进行,但必须与其他工作和设计考虑因素进行权衡。我问这个问题是为了收集信息,以便做出正确的决定。非常感谢您对这种性质的想法和评论。
已邀请:
一台计算机上运行40,000个线程以上的成本是多少?让JVM / Linux OS管理这么多线程会使我失去多少性能?请记住,它们都已正确配置为在没有工作时可以进入睡眠状态。因此,我只是在谈论额外的开销和由数量庞大的线程引起的问题。 在JVM空间中,每个线程都需要一个线程堆栈(默认256kb)以及Thread对象和连接的对象。可以使用-Xss选项更改默认线程堆栈,但是我相信 下限是64kb。 (40,000 x 256kb是10Gb ...) 在Linux上,每个线程还占用一个OS线程描述符,当线程不执行...和其他操作时,它将有助于线程的注册上下文。这些描述符是预先分配的,我相信它们不会被分页。这是管理员需要增加的资源。 无论线程处于唤醒状态还是睡眠状态,都将使用这些资源。 另一个问题是您需要谨慎使用wait / notifyAll进行同步。如果有多个线程在同一个对象上等待,那么当每个线程被唤醒时,notifyAll将导致大量活动。 (但是您可以通过在同一对象上没有太多线程等待来避免这种情况。) 有关使用大量线程的后果的更多信息,请参见Oracle Java Threading页面。 我的感觉是40,000个线程过多。理想的线程数与您拥有的物理处理器/内核的数量成正比。尽管拥有大量线程并不一定会导致性能下降,但是您将占用大量资源,这可能会带来间接的性能问题;例如较长的GC时间,可能导致VM崩溃。 对于您的应用程序而言,更好的体系结构是实现线程池和工作队列,以将工作分配给数量更少的活动线程。
现在,您说没有工作时线程将进入睡眠状态。多久上班一次?并发完成多少个工作单元?如果该数目大于处理器数目,并且所述工作主要基于CPU,则实际上您会看到整体性能下降。 但是,让我们假设在任何给定时间完成的工作量就是处理器的数量。如果真是这样,那么我看到的第一大问题就是将要发生的上下文切换数量。 Java(通常基于)中的上下文切换约为100个指令。如果您的所有线程在短时间内被接通(唤醒)以执行某些工作,那么我们正在谈论的是4,000,000条额外的指令。 有关上下文切换成本的更多信息,因为它们可能比其他任何因素对您的程序产生更大的影响。本文档的摘录说明了在切换时验证线程的本地缓存的成本 接通新线程后, 所需的数据不太可能在 本地处理器缓存,因此上下文 切换导致大量缓存 错过,因此线程运行一点 刚开始时比较慢 预定的。这是原因之一 调度程序给每个可运行的 穿线一定的最短时间 即使有许多其他线程 等候 除此之外,您还需要分配增加的堆栈空间,并为40,000个线程对象分配堆空间(对于线程来说,这大约只有7兆浅堆)。

要回复问题请先登录注册