【发布时间】:2012-11-20 16:24:07
【问题描述】:
我们有几个 Java 应用程序在同一台 Linux 机器上运行并通过 TCP 来回发送消息。我们使用 ServerSocket 和 Socket 来创建连接。我想尽可能地减少这种通信的延迟。似乎可以在我们的盒子上分配一个核心来进行连续的 TCP 轮询,这将提高性能。在 Linux 和/或 Java 中是如何做到的?
【问题讨论】:
我们有几个 Java 应用程序在同一台 Linux 机器上运行并通过 TCP 来回发送消息。我们使用 ServerSocket 和 Socket 来创建连接。我想尽可能地减少这种通信的延迟。似乎可以在我们的盒子上分配一个核心来进行连续的 TCP 轮询,这将提高性能。在 Linux 和/或 Java 中是如何做到的?
【问题讨论】:
有一种方法可以实现这一点,但它不是可移植的。
您需要做的是: 1)找出本机线程ID 2) 为本地线程设置亲和力
您可以使用 sun.jvm.hotspot 下的包中不受支持的类来获取本机线程 ID(在 linux 上是进程 ID)。您可以通过包含 sa-jdi.jar(与 jdk 捆绑)来链接这些类以构建路径。由于我不喜欢从其他网站复制答案,您应该去阅读github 的说明
一旦您获得了本机线程 ID,您应该使用“taskset”命令行实用程序来更改亲和性。你可以在另一个帖子中找到说明how to use taskset
【讨论】:
不是。在 Java 中无法将线程分配给内核。
并且分配单个内核不会提高性能;相反,它可能会减少它。我不知道你所说的“轮询”是什么意思,但你不能用套接字来做到这一点:你必须在 read() 中使用单独的线程阻塞。如果您正在考虑使用InputStream.available(),那么您就完全找错了树,应该将 NIO 与 Selector 一起使用。
【讨论】: