【问题标题】:WorkManager and a high workloadWorkManager 和高工作量
【发布时间】:2010-08-01 09:06:38
【问题描述】:

我正在开发一个与网络上数百个设备交互的应用程序。提交的工作类型需要大量并发线程(主要是因为它们中的每一个都需要网络交互并且单独进行,但也有其他原因)。目前,我们的每个交互设备需要大约 20-30 个线程。

一个简单的计算可​​以在数千个线程上计算,甚至多达 10,000 个线程。如果我们撇开线程切换等 CPU 损失不谈,在 CentOS 64 位上运行的 Java 5 可以处理多少个线程?这只是 RAM 的问题还是我们应该考虑其他什么?

谢谢!

【问题讨论】:

  • 如果您认为 “大量的网络 I/O” [原文如此] 意味着并发需要大量线程,您就完全错了,正如您对 YoK 的评论.有很多系统在不使用数千个线程的情况下产生和消耗大量网络 I/O。
  • @NoozNooz42 10k 连接是一个巨大的数量而且肯定不是微不足道的,线程与否,即使它之前已经完成。
  • @NoozNooz42 除了 NIO(我在下面评论过,我们无法做到)并且考虑到网络 IO(以及在远程服务器上的处理)需要很长时间,您将如何获得更好的性能?

标签: java multithreading high-load


【解决方案1】:

在这种情况下,总是建议使用线程池。

线程池解决了两个不同的问题:由于减少了每个任务的调用开销,它们通常在执行大量异步任务时提供改进的性能,并且它们提供了一种限制和管理资源的方法,包括执行时消耗的线程一组任务。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,比如完成任务的数量。

ThreadPoolExecutor 是你应该使用的类。

http://www.javamex.com/tutorials/threads/ThreadPoolExecutor.shtml

【讨论】:

  • 其实是在使用线程池。这是由于要完成的网络 I/O 量而并发所需的线程数。
  • @Yon 那么你的意思是你打开多个套接字连接到单个设备?在这种情况下,您还需要单个设备的连接池来限制每个设备的套接字数量。通常套接字限制的数量取决于文件系统可用的 inode 数量。
  • 如果您有 20-30 个与设备的连接,请尝试使用 NIO 与设备交互 - 这将使您减少到每个设备 1 个或 2 个线程 - 并将线程计数减少到可管理的水平。
  • 我完全同意使用蔚来。
  • 我们不能使用 NIO - 这是因为通信是由不使用 NIO 的第三方库处理的。遗憾的是,目前我们没有比这个第三方库更好的选择。
【解决方案2】:

我认为 java 最多可以使用 65k 线程,您唯一需要考虑的是堆栈空间 - linux 默认情况下为每个线程/进程分配 48k 作为堆栈空间,这对于 java(没有堆栈)来说是浪费的-分配的对象,因此使用更少的堆栈空间)。这很容易为 10k 线程使用 500 megs。

【讨论】:

    【解决方案3】:

    如果这确实是一个绝对要求,您可能不想查看专门为处理这种级别的并发线程而构建的语言,例如 erlang。

    【讨论】:

      【解决方案4】:

      就像其他人建议的那样,您应该使用 NIO。我们有一个应用程序使用了很多(但比您计划的要少得多)线程(例如 1,000 )并且它已经非常低效。如果您必须使用那么多线程,那么绝对是时候考虑使用 NIO。

      对于网络,如果您的应用程序使用 HTTP,一个非常简单的工具将是 Async-HTTP-client 由该领域的 2 位非常著名的作者编写。

      如果您使用不同的协议,建议使用 Async-HTTP-client (netty) 的底层实现。

      【讨论】:

      • 我们不能使用 NIO - 这是因为通信是由不使用 NIO 的第三方库处理的。遗憾的是,目前我们没有比这个第三方库更好的选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多