java - Raspberry Pi 上 Java 的线程性能问题

标签 java linux multithreading raspberry-pi3

此应用程序的目标是通过 TCP 处理 800 个并发客户端,每个客户端每秒发送一个 3.5kb 的 xml。这些请求中的每一个都需要被解析(参见代码片段)。这发生在不同的线程上。

该项目的局限性在于它必须在小型 Raspberry Pi3(1.2 ghz 四核,1gb 内存)上运行。当我将负载增加到超过 150 个并发客户端(80% 的 CPU 使用率)时,我遇到了利用率问题。

当我在我的开发机器上运行这个程序时,它似乎运行得很好。 (0-1% 使用率,低于 150)。我知道我的开发机器比 RPI 更强大,因此运行得更好。但差异似乎太大了。

在我当前的设置中,我使用 Java nio 来处理/读取所有传入连接。然后我使用多个线程来读取数据。

Current Setup

这是当前在处理线程上运行的简单代码。还尝试一次读取一个简单的 byte[] 数组 1 个字节。甚至阅读 StaX 流。 我尝试过的每一种读取方式,操作的“读取类型”都给出了最差的性能。

BufferedInputStream input = new BufferedInputStream(new ByteArrayInputStream(buffer.array(), 0, bytecount));
int current;
/* In this snippet input.read() is the cause of performance issues 
Reading directly from byte[] gives similar poor performance.
*/
while ((current = input.read()) != -1) {
    continue;
}

根据我的分析器,Input.read() 调用在 Pi 上使用了大量的处理能力,占总 CPU 时间的 97%。另外 3% 是处理连接的主线程。

在我的开发机器上,这几乎是颠倒的,主线程占了大部分 cpu 使用率,占 93%。 7% 用于处理线程。

是什么导致了如此巨大的差异?与我的其他机器相比,为什么 pi 上的这个 read() 调用如此昂贵,这可能与内存有关吗?

注意事项:

  • Pi 运行 raspbian linux - openjdk 1.8.0_40-internal
  • 开发机器运行 win 10 - Java(TM) SE 运行时环境(build 1.8.0_121-b13)
  • 尝试在两台机器上使用 -Xms -Xmx 标志运行,结果相同。

最佳答案

事实证明,问题是 Raspberry Pi 3 上 JVM 和 32 位操作系统的组合。当使用 OpenJDK 运行 32 位 raspbian 时,我的应用程序性能非常差(尤其是在“读取”调用时)。切换到 Oracle JVM 给了我“更好”的预期性能。

然而,当切换到 64 位操作系统(在我的例子中是 OpensSuse)时,OpenJDK 和 Oracle JVM 的性能都很好。

(在评论中感谢@jww,建议切换到 64 位操作系统)

关于java - Raspberry Pi 上 Java 的线程性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956400/

相关文章:

java - 如何以编程方式选择 ClientRegistration

java - 简单的 JAVA : Password Verifier problem

windows - 帮助linux下远程调试

java - 线程问题 : program doesn't start

c - 将指针char参数传递给线程中的函数

multithreading - 使用条件变量在线程之间进行通信

java - 如何调试有关字符串和 int 的此错误

java - 使用 Spring Security (Spring Boot 3.0.2) 时如何访问 H2 控制台?

linux - 在 docker 命令中使用 $() 似乎不起作用

linux - 如何将 perf(Linux 工具)的输出保存到文件中?