簡體   English   中英

當運行多個應用實例而不是一個實例時,為什么Java App占用的總CPU更少?

[英]Why does Java App take less overall CPU when running multiple instances of app instead of one instance?

我在Ubuntu上運行了一個Java應用程序,該應用程序在套接字上偵聽傳入的連接,並創建一個新線程來處理每個連接。 該應用程序在每個連接上接收傳入的數據,以處理數據,並將處理后的數據發送回客戶端。 很簡單。

僅運行一個應用程序實例並具有多達70個並發線程,該應用程序會將CPU的運行速度提高到150%以上。並且在繼續處理傳入數據方面遇到麻煩。 它在Dell 24 Core System上運行。

現在,如果我創建了3個應用程序實例,並將傳入的數據分配到同一台計算機上的3個實例中,則同一台計算機上的最大總體cpu可能僅達到25%。

問題是,為什么一個應用程序實例使用的CPU數量是同一台計算機上3個實例各自處理的數據使用量的三分之一的6倍?

我不是Linux專家,但是誰能推薦一種工具來監視系統資源,以找出瓶頸發生在哪里? 關於為什么3個實例處理的數據量與1個實例相同的任何線索會占用更少的整體系統CPU?

通常情況並非如此。 也許您在讀取CPU使用率錯誤 嘗試使用tophtoppsvmstat命令查看發生了什么。

我可以想象發生這種行為的原因之一- 資源爭用 如果您擁有某種鎖定或繁忙循環,該鎖定或繁忙循環僅在一個實例(最大連接數或最大線程數)上顯示出來,則您的系統可能無法最佳地並行處理並等待資源。 我建議將諸如jconsole類的內容連接到您的Java進程,然后看看發生了什么。

作為一般建議,請檢查每個JVM有多少個線程可用,以及是否正確使用了它們。 也許您沒有為JVM分配足夠的內存 ,所以它經常進行垃圾回收。 如果您使用數據庫操作,則還要檢查那里的瓶頸。 剖析並找到花費大部分時間的地方,並根據該功能花費的時間百分比來比較1-3個實例。

暫無
暫無

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

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