[英]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.