簡體   English   中英

Raspberry Pi上Java的線程性能問題

[英]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()調用如此昂貴,它可能與內存有關嗎?

筆記:

  • Pi運行raspbian linux - openjdk 1.8.0_40-internal
  • Dev機器運行win 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位操作系統)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM