Raspberry Pi上Java的线程性能问题
作者:互联网
该应用程序的目标是通过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机器运行赢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位操作系统)
标签:java,linux,multithreading,raspberry-pi3 来源: https://codeday.me/bug/20190710/1428663.html