[英]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()调用如此昂贵,它可能与内存有关吗?
笔记:
事实证明,问题是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.