【问题标题】:How many threads should I use in a vm? [closed]我应该在 vm 中使用多少个线程? [关闭]
【发布时间】:2013-01-10 10:23:40
【问题描述】:

在我们的项目中,我创建了很多 java 线程来做一些连续的工作。

在大多数情况下,这些线程处于休眠状态,因此总 CPU 成本较低。

使用1168 线程,system overload 应低于 0.20

但后来我注意到,如果我用 jvm 创建超过 1000 个线程,那么我会得到 ​​p>

fork: retry: Resource temporarily unavailable

当我想通过ssh 连接vm(我的意思是VM,而不是jvm)时,这似乎是一个关于系统资源的严重问题..

而且我非常担心我的程序中会发生什么..

【问题讨论】:

  • 你只是用完了可用的线程/进程。 到底为什么需要超过 1000 个线程?
  • 在我看来,您超出了 linux 内核参数。它们中的大多数都非常可调。见:stackoverflow.com/questions/9361816/…
  • @thkala 是的,我确实有很多单独的工作应该在单独的线程中完成。正如我所说,很多时候,这些线程都在等待系统 IO
  • @jackalope:你的日志怎么说?你用完了哪个资源?进程/线程槽?内存?
  • @jackalope:启动大量线程很少是答案。处理器数量大约增加一倍就足够了——你应该对其他一切使用异步 I/O...

标签: java linux multithreading


【解决方案1】:

here 所述,Linux 系统上的线程和进程的总数是有限的,直接通过其他资源限制。您显然超出了该限制,并且创建新 SSH 会话所需的 fork() 调用失败。

你为什么要创建这么多线程?

当线程数显着超过可用处理器内核数时,您很少会获得任何性能优势,并且每个线程确实有一个最小的内存要求集不可忽略不计。

如果您正在处理某种形式的C10K 问题,您应该考虑使用异步 I/O 组合多个线程。

【讨论】:

  • 注意到我的 vm 中的这个值等于 124413 ,有什么建议吗??
  • @jackalope:不仅仅是那个数字。内存子系统施加的限制可能更相关。无论如何,在我看来,您需要修复您的应用程序 - 增加限制只会延迟不可避免的事情。您的日志中是否有任何内容可以帮助您找到罪魁祸首?
  • 抱歉,在 /var/log/messages 中找不到日志
【解决方案2】:

这么多线程看起来不像是一个好的设计。我建议在一个循环中接收当前唤醒您的线程的所有事件,这些事件可以立即将它们转换为Futures 或 Runnables 并发布到一些ExecutorService。该服务可以为您管理一个线程池。 ServerSocket 和 Socket 的标准方法就是这样实现的。

【讨论】:

  • 是的,实际上我有很多ExecutorService......
  • 你只是一个应该处理所有任务的人。您可以选择将根据需要分配大量额外线程的实现。
  • 是的,这可能是个好主意!
  • @AudriusMeškauskas:如果任务像 OP 提到的那样受 I/O 限制,线程池不会停止吗?我不知道有任何标准的 Java 线程池可以自行执行调度和负载平衡......
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多