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(),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 解决方法
事实证明,问题是Raspberry Pi 3上的JVM和32位操作系统的组合.当使用OpenJDK运行32位raspbian时,我的应用程序的性能非常差(特别是在“读取”调用上).切换到Oracle JVM给了我“更好”的预期性能.
但是当切换到64位操作系统(在我的情况下是OpensSuse)时,OpenJDK和Oracle JVM的性能都很好. (在评论中致@jww,建议切换到64位操作系统) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |