编程语言
首页 > 编程语言> > Raspberry Pi上Java的线程性能问题

Raspberry Pi上Java的线程性能问题

作者:互联网

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

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