繁体   English   中英

Raspberry Pi上Java的线程性能问题

[英]Thread performance issues for Java on Raspberry Pi

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

这个项目的局限在于它必须在一个小的Raspberry Pi3(1.2 ghz四核,1gb ram)上运行。 当我将负载增加到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;
}

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

在我的开发机器上,这几乎被翻转,主线程占了大部分CPU使用率的93%。 7%用于处理线程。

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

笔记:

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

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

但是当切换到64位操作系统(在我的情况下是OpensSuse)时,OpenJDK和Oracle JVM的性能都很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM