【发布时间】:2012-08-09 17:25:20
【问题描述】:
我目前正在研究分布式应用程序的性能。我的目标是一个网络组件。当前,对于每个连接,都有一个专用线程以阻塞模式处理套接字。我的目标是减少线程数(不降低性能)并尽可能提高性能。
我重新设计了网络组件以使用异步通信,并尝试使用 1 到 2 个线程进行整个网络处理。我做了一个简单的测试,我从一个节点循环写入并在另一个节点上读取,这是为了测试最大 nw 线程能力,我发现我的繁忙循环实现正在消耗 100% 的 cpu 并且每秒获得更多的操作,然后我们要求。所以我在现有的应用程序中集成了这个繁忙的循环实现。
我发现的问题是其他线程不允许这些异步 nw 线程获取完整的 cpu,即使我有一个 8 核系统并且我们使用的 cpu 不超过 400%。基本上,作为一名 C 程序员,我可以通过将我的 nw 线程绑定到一个核心并提高其调度优先级来解决这个问题,这样其他线程仍然可以在其他核心上运行。我无法在 Java 中做类似的事情。 Java 线程优先级存在冲突的 cmets。另外我不想降低其他线程的优先级,因为它可能有它自己的副作用。
你会如何解决这个问题?
【问题讨论】:
-
See this post,这是一种设置线程处理器亲和性的方法,当您使用 Java 时,虽然它实际上是使用 JNI 来完成这项工作。
-
你想让两个线程处理所有的网络流量。最多会以 100% 使用两个内核。您正在 100% 运行四个内核,因此从这里的信息来看,您似乎没有问题。是什么让您认为自己有问题?
-
抱歉没有明确说明。 nw 流量当前由 8 个线程处理,它们一起消耗的 CPU 不超过 100%。 400% 是整个应用程序的负载。我正在考虑通过使用单个(或 2 个)异步 nw 线程来减少线程数。
标签: java multithreading scheduling