摘要:如果你是爲非常大的公司工作,那麼有99.99%的可能性,你可能沒有必要說明你的應用程序的內存大小應該是什麼,因爲這個決定已經由坐着的精英/半神做出在象牙塔上。堆轉儲基本上是一個文件,它包含有關應用程序內存的所有信息,比如存在的對象,它們的引用是什麼,每個對象佔用多少內存......大內存大小應用程序的堆轉儲也往往非常大。

我應該運行我的應用程序,只有很少的實例(即機器)具有大內存大小或許多實例具有較小的內存大小?哪種策略最佳?這個問題可能經常面臨。在構建應用程序20年後,在構建JVM性能工程/故障排除工具(GCeasy,FastThread,HeapHero)之後,我仍然不知道這個問題的正確答案。與此同時,我認爲這個問題也沒有二元答案。在本文中,我想分享我對這個主題的觀察和經驗。

兩個數十億美元的企業故事

由於我們的JVM性能工程/故障排除工具已在大型企業中得到廣泛應用,因此我有機會看到世界級的企業應用程序實施。最近我有機會看到兩家超級增長的科技公司(如果我說他們的名字,每個閱讀這篇文章的人都會知道它們)。兩家公司總部位於硅谷。他們的業務是技術,所以他們知道在工程方面他們在做什麼。他們是華爾街的寵兒,享有很高的估價。他們的市值達數十億美元。他們是現代蓬勃發展的企業的典範。對於我們的談話,我們稱這兩家企業爲A公司和B公司。

我非常驚訝地看到兩家企業在內存大小方面都採用了兩個極端*。Company-A將其堆大小(即-Xmx)設置爲250gb,而company-B將其堆大小設置爲2gb。即company-A的堆大小比Company-B的堆大小大125倍。兩家企業都對自己的內存大小設置充滿信心。正如他們所說:“證明在布丁中”,兩家企業都在擴展和處理數十億關鍵業務交易。

這是一個很好的經驗,可以看到兩家公司在相同的地理區域內進入相同的業務,具有或多或少相同的收入/相同的市值,同時在內存大小方面採用兩個極端。鑑於這種真實的體驗,什麼是正確的答案?大尺寸或小尺寸的內存?我的結論是:如果你有一支優秀的團隊,你可以成功採取任何一種策略。

大內存可能會很昂貴

具有少量實例(即機器)的大內存大小往往比小內存大小,更多實例更昂貴。這是一個簡單的數學,基於美國東部(弗吉尼亞北部)地區的AWS EC2實例的成本:

m4.16xlarge - 256GB RAM - Linux按需實例成本:3.2美元/小時

T3a小型 - 2GB內存 - Linux按需實例成本:0.0188美元/小時

因此,要擁有256GB RAM的容量,我們必須獲得128'T3a small'實例(即128個實例x 2GB = 256GB)。

128 x T3a小 - 2GB RAM - Linux按需實例成本:2.4064美元/小時(即128 x $ 0.0188 /小時)。

它意味着大的內存大小,幾個實例的成本比每個實例的小內存大小多0.793美元/小時(即3.2美元到2.4064美元)。換句話說,“具有少量實例的大內存大小”策略的成本要高出33%。

當然,可以提出另一個反駁論點:如果你的機器數量較少,你可能需要更少的工程師,更少的電力,更少的房地產。修補,升級服務器也可能更容易。

業務需求

在某些情況下,業務本身的性質決定了應用程序的內存大小。這是我們遇到的現實事件:當我們構建HeapHero(堆轉儲分析工具)時,我們工具的內存大小必須大於它解析的堆轉儲文件。假設堆轉儲文件大小爲100gb,那麼HeapHero工具的內存大小必須大於100gb。沒有選擇。

假設您正在緩存大量(例如200gb)數據以最大化應用程序的性能,那麼您的堆大小必須超過200gb。你將無法選擇。因此,在某些情況下,業務需求將決定您的內存大小。

性能和故障排除

如果您的內存大小很大,那麼垃圾收集暫停時間通常也會很高。垃圾收集是一個在應用程序中運行的過程,用於清除內存中未引用的對象。如果你的內存很大,那麼內存中的垃圾量也會很大。因此,清理垃圾所需的時間也很長。當垃圾收集運行時,它會暫停您的應用程序。但是這個問題有解決方案:

你可以使用無休止的JVM(比如'Azul')

需要進行適當的GC調整以減少暫停時間

同樣,如果您需要解決任何內存問題,則必須從應用程序捕獲堆轉儲。堆轉儲基本上是一個文件,它包含有關應用程序內存的所有信息,比如存在的對象,它們的引用是什麼,每個對象佔用多少內存......大內存大小應用程序的堆轉儲也往往非常大。分析大型堆轉儲也很困難。即使是世界上最好的堆轉儲工具,如Eclipse MAT,HeapHero在解析超過100GB的堆轉儲方面也面臨挑戰。在測試實驗室中重現這些問題,存儲這些堆轉儲文件,共享這些堆轉儲文件都是挑戰。

情緒第一 - 理由下一步

在閱讀了Jonah Lehrer撰寫的“我們如何決定”之類的書籍之後 - 我相信您之前的經歷,情感在決定應用程序的內存大小方面起着關鍵作用。我曾經在一家大型金融機構工作。這家金融機構的首席架構師建議我們運行具有非常大內存大小的JVM,他給出的理由是:“ 我們過去常常運行內存非常大的大型機”。

結論

如果你是爲非常大的公司工作,那麼有99.99%的可能性,你可能沒有必要說明你的應用程序的內存大小應該是什麼,因爲這個決定已經由坐着的精英/半神做出在象牙塔上。可能很難扭轉或改變這一決定。

如果您有選擇或選擇做出決定,您對內存大小的決定很可能會受到您之前的經驗和情緒的影響。無論哪種方式,只要您擁有合適的團隊,就不會出錯(即只需要很少的內存大小實例或大量內存小的實例)。

相關文章