簡體   English   中英

敏感的Xmx / GC默認為小堆的微服務

[英]Sensible Xmx/GC defaults for a microservice with a small heap

在我的公司,我們正在嘗試使用基於JVM的微服務。 它們被設計為水平擴展,因此我們使用相當小的容器(最多2G堆,通常1-1.5G)運行每個實例的多個實例。 我們使用的JVM是1.8.0_40-b25。

每個這樣的實例通常處理高達100 RPS,最大內存分配率約為250 MB / s。

問題是:什么樣的GC可能是一個明智的默認開始? 到目前為止,我們使用CMS與Xms = Xmx(以避免在堆大小調整期間暫停)和Xms = Xmx = 1.5G。 結果很不錯 - 我們幾乎沒有看到任何主要的GC執行。

我知道G1可以給我更小的停頓(以總吞吐量為代價)但是AFAIK它需要更多的“呼吸”空間並且至少3-4G堆才能正常運行。

任何提示(除了Azul的Zing:D)?

提示#1: 做實驗

假設您的微服務至少部署在兩個節點上,在CMS上運行一個,在G1上運行另一個節點,看看響應時間是多少。

不太可能,但如果你能發現G1性能如此之好,需要原始簇大小的一半呢?

附注:

  • re:“250Mb / s” - >如果所有這些都是堆棧內存(或者,如果它是年輕的gen)那么G1將提供很少的好處,因為這些區域的收集是免費的。
  • re:“100 RPS” - >在很多情況下,我們發現減少系統中的並發請求(通過代理配置或應用程序容器級別)可以提高吞吐量。 鑒於小堆,你很可能也有小的CPU數(2到4)。
  • 此外,還有關於調整內存占用空間的正式Oracle提示。 它可能無法反映1.8_40上的最新配置,但無論如何它都是很好的閱讀。

測量完整GC后保留的內存量。 添加到此每秒分配的內存量,並乘以2 - 10,具體取決於您希望有一個次要GC的頻率。 例如,每2秒或每10秒。

例如,假設您在完整的GC之后保留了最多500 MB,並且每隔幾秒就可以使用GC,那么您可以擁有500 MB + 2 * 250 MB或大約1 GB的堆。

RPS的數量並不重要。

暫無
暫無

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

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