如何估算内存消耗?
這個故事可以追溯到至少十年之前,當時我第一次接觸PHB時遇到一個問題:“在生產部署中,我們需要購買多大服務器”。 我們正在構建的新的,閃亮的系統距離生產開始還有9個月的時間,顯然該公司已承諾提供包括硬件在內的整個解決方案。
天哪,我有麻煩了。 憑借幾年的經驗,我幾乎可以擲骰子了。 盡管我確信我完全缺乏信心是顯而易見的,但我仍然不得不想出答案。 四個小時的谷歌搜索之后,我回想起坐在那里,同樣的問題仍然徘徊在我眼花bed亂的臉前:
“如何估算對計算能力的需求?”
在本文中,我為您提供了有關如何估算全新Java應用程序的內存需求的粗略指導,從而開始了這一主題。 對于不耐煩的用戶,答案將是從大約等于5 x [Live Data占用的內存量]的內存開始,然后從那里開始進行微調。 對于那些對背后的邏輯更加好奇的人,請留在我身邊,我將帶您進行推理。
首先,我只能建議避免在沒有詳細信息的情況下回答這樣的問題。 您的答案必須基于性能要求,因此,即使沒有先澄清這些要求,也不要開始。 我的意思不是太含糊的“系統需要支持700個并發用戶”,而是考慮到數據量和使用模式,關于延遲和吞吐量的更為具體的描述。 也不要忘記預算-我們所有人都可以夢到亞毫秒級的延遲,但是那些沒有HFT銀行骨干預算的人-不幸的是,這只是一個夢想。
現在,假設您已具備這些要求。 下一站將是創建模擬用戶行為的負載測試腳本。 如果現在可以同時啟動這些腳本,那么您已經為答案奠定了基礎。 正如您可能已經猜到的那樣,下一步涉及我們通常建議的不要猜測的建議。 但是要注意。
實時數據大小
即,我們尋求最佳內存配置需要捕獲實時數據大小。 捕獲了這一點之后,我們就可以進行微調的基線配置了。
如何定義實時數據大小? Charlie Hunt和Binu John在他們的“ Java Performance ”書中給出了以下定義:
實時數據大小是在穩定狀態下運行應用程序所需的一組長期對象消耗的堆大小。
有了定義,我們準備在打開GC日志記錄的情況下對應用程序運行負載測試(-XX:+ PrintGCTimeStamps -Xloggc:/tmp/gc.log -XX:+ PrintGCDetails),并可視化日志(使用例如gcviewer的幫助)來確定應用程序達到穩定狀態的時間。 您所追求的類似于以下內容:
我們可以在熟悉的雙鋸齒圖形中看到GC在次要GC和Full GC運行中都能完成工作。 在第21秒運行第一個完整GC之后,此特定應用程序似乎已達到穩定狀態。 但是,在大多數情況下,需要10-20次完整GC運行才能發現趨勢變化。 在運行了四個完整的GC之后,我們可以估計實時數據大小大約等于100MB。
前面提到的Java Performance書現在表明,在典型的Java EE應用程序中,“實時數據大小”與最佳內存配置參數之間存在很強的相關性。 該領域的證據也支持他們的建議:
將最大堆大小設置為3-4 x [實時數據大小]
因此,對于當前的應用程序,我們應該將-Xmx設置為介于300m和400m之間,以進行初始性能測試,然后從那里開始進行測試。
我們對本書中的其他建議有不同的看法,建議將最大永久代大小設置為1.2-1.5 x [永久代的實時數據大小],將-XX:NewRatio設置為[[實時數據大小]。 目前,我們正在收集更多數據以確定正相關性是否存在,但在此之前,我建議您將生存和簡化配置的決定基于監視分配率。
您現在可能會問為什么要打擾。 的確,有兩個原因不引起立即關注:
- 在撰寫本文時,8G內存芯片的價格不到100美元
- 虛擬化,特別是在使用大型供應商(例如Amazon AWS)時,使調整容量變得容易
這兩個原因都是部分有效的,并且絕對減少了精確配置的需求。 但是他們兩個仍然把你置于危險區域
- 當“以防萬一”投入大量內存時,您很可能會顯著影響延遲-進入8G以上的堆時,引入跨越數十秒的Full GC暫停非常容易。
- 當以“稍后調整”的思想進行過度配置時,“后期”部分趨向于永不滿足。 正因為如此,我面對了許多在預置環境上運行的應用程序。 例如,我發現在Amazon EC2 m1.xlarge實例上運行的上述應用程序使該公司每年每實例花費4,200美元。 將其轉換為m1.small可以使實例的費用減少到520美元。 如果您的部署規模很大,則可以從您的運營預算中看到8倍的成本降低,請相信我。
摘要
不幸的是,我仍然看到太多的決策完全像十年前我被迫做的那樣。 這會導致容量規劃不足和過度規劃,兩者都是同樣糟糕的選擇,尤其是在您無法享受虛擬化優勢的情況下。
我對我很幸運,但是您可能不會與您的客戶見面,所以我只建議您使用本文中描述的簡單框架進行實際計劃。
翻譯自: https://www.javacodegeeks.com/2014/01/how-to-estimate-memory-consumption.html
總結
- 上一篇: 小米6X可以放内存卡吗
- 下一篇: 使用调试器进行事后跟踪