Geo*_*aal 6 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 来处理/读取所有传入的连接。然后我使用多个线程来读取数据。
这是当前在处理线程上运行的简单代码。还尝试一次读取一个简单的 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;
}
Run Code Online (Sandbox Code Playgroud)
根据我的分析器, Input.read() 调用在 Pi 上使用了大量的处理能力,占总 CPU 时间的 97%。另外 3% 是处理连接的主线程。
在我的开发机器上,这几乎是翻转的,主线程占了大部分 cpu 使用率,93%。7% 用于处理线程。
是什么导致了如此大的差异?为什么与我的另一台机器相比,pi 上的 read() 调用如此昂贵,这可能与内存有关吗?
笔记:
事实证明,问题是 Raspberry Pi 3 上 JVM 和 32 位操作系统的组合。当使用 OpenJDK 运行 32 位 raspbian 时,我的应用程序性能非常差(特别是在“读取”调用时)。切换到 Oracle JVM 给了我“更好”的预期性能。
然而,当切换到 64 位操作系统(在我的例子中是 OpensSuse)时,OpenJDK 和 Oracle JVM 的性能都很好。
(感谢评论中的@jww,建议切换到 64 位操作系统)
| 归档时间: |
|
| 查看次数: |
1497 次 |
| 最近记录: |