微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java在Raspberry Pi上的线程性能问题

这个应用程序的目标是通过TCP处理800个同时的客户端,每个客户端每秒发送一个3.5kb xml。 这些请求中的每一个都需要被parsing(参见代码片断)。 这发生在不同的线程上。

这个项目的局限性在于它必须运行在一个小型RaspBerry Pi3(1.2GHz四核,1GB RAM)上。 而我遇到利用率问题时,我增加了150以上的同时客户端(80%的cpu使用率)的负载

当我运行这个程序,我的开发机器似乎运行得非常好。 (0-1%使用,低于150)。 我知道我的开发机器比RPI更强大,因此运行得更好。 但差异似乎太大了。

在我目前的设置中,我使用Java nio来处理/读取所有传入的连接。 然后我使用多个线程来读取数据。

如果应用程序在GC中,如何可靠地进行JVM核心转储?

无法在Eclipse中导入Apache HTTP

问题安装OpenNLP

2K显示器上的JFileChooser图标

使用framebuffer错误运行JavaFX应用程序错误Cubieboard A10

这是当前在处理线程上运行的简单代码。 也尝试读取一个简单的byte []数组,每次1个字节。 甚至读一个StaXstream。 我试过的每一个阅读变化,操作的“阅读types”给出了最差的performance。

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%进入处理线程。

什么可能导致这种巨大的差异? 为什么这个read()调用的pi比我的其他机器贵得多,是否可以和内存有关呢?

笔记:

Pi运行raspbian linux – openjdk 1.8.0_40内部

开发机器运行赢10 – Java(TM)SE运行环境(build 1.8.0_121-b13)

尝试在两台机器上使用-xms -Xmx标志运行,结果相同。

java.security.NoSuchProviderException:没有这样的提供者:SunMSCAPI

在Windows任务pipe理器中更改java进程描述

如何优雅地closures/终止java进程?

分析jHiccup延迟。 57us打嗝的来源

发送本机事件

结果发现问题是RaspBerry Pi 3上的JVM和32位操作系统的组合。当用OpenJDK运行32位raspbian时,我的应用程序的性能非常差(特别是在“读取”调用时)。 切换到Oracle JVM为我提供了“更好”的预期性能

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐