天天看點

JVM調優-微服務的記憶體之痛#JVM調優

#JVM調優

文章目錄

  • #JVM調優
    • #楔子
    • #開始調優
    • #尾聲

#楔子

最近部落客正在為一家創業公司從零開始架構微服務以及建立一套完善的DevOps流水線.

因為經費原因,公司前期并沒有在區域網路搭建測試環境,而是用阿裡雲ECS作為測試和未來的生産環境.

阿裡雲伺服器記憶體有限(隻有8個G),前期所有微服務都是部署到一台機器上進行測試,但是部署了7個服務後,發現記憶體沒了…

以下是我已經部署的服務

  • eureka 服務注冊與發現
  • config 分布式配置中心
  • zipkin 分布式鍊路追蹤
  • zuul 分布式路由網關
  • admin 分布式系統監控
  • service-admin 管理者服務提供者
  • api-admin 管理者服務消費者

然後…我的記憶體就隻剩800M了

JVM調優-微服務的記憶體之痛#JVM調優

然後我下線一個服務提供者你們再感受下

JVM調優-微服務的記憶體之痛#JVM調優

一個服務1個G,我後面至少還要上至少8個服務啊

這個不是完蛋了個屁的嗎?

是以想到了JVM調優,限制每個服務的堆記憶體大小(我算了下,前前後後加起來有15~21個服務),對于微服務來說,這真的很少了,并且這些服務隻是這家公司藍圖的一個子產品而已,最後完全開發完畢可能會上線150+個服務.

沒錯,這就是微服務,記憶體跟玩兒似的

#開始調優

首先我們需要計算下,按照16個服務計算,8G的記憶體最多隻能給每個服務配置設定512M的記憶體,為了後期上線更多服務做準備,我們應當給每個服務配置設定400M左右記憶體(我快哭出來了)

經典設定

java -Xmx400m -Xms400m -Xmn150m -Xss1024k
           

簡單說明下調優參數的值

  • -Xmx400m 設定JVM最大記憶體為400M
  • -Xms400m 設定JVM最小記憶體為400M(與最大值保持一緻可以防止每次垃圾回收(GC)後JVM對記憶體進行再配置設定)
  • -Xmn150m 設定新生代大小,新生代大小會影響到老年代的大小,Sun推薦設定為總記憶體的3/8
  • -Xss1024k 每個線程堆棧大小,值越小能生成的線程數越多,但是一般不超過5000個,在遞歸場景下值太小可能會造成堆棧溢出

然後我們将分布式配置中心服務啟動指令更新後重新上線,看看效果如何

修改Dockerfile

JVM調優-微服務的記憶體之痛#JVM調優

等待持續內建/部署

JVM調優-微服務的記憶體之痛#JVM調優

再次檢視記憶體

JVM調優-微服務的記憶體之痛#JVM調優

一個服務省出了550M~600M的記憶體

檢視400M能不能跑起來(要跑不起來就搞笑了)

可以看到Config服務已經在注冊中心注冊

JVM調優-微服務的記憶體之痛#JVM調優

分布式配置中心也能正常通路

JVM調優-微服務的記憶體之痛#JVM調優

#尾聲

依照上面的操作,我将所有的服務JVM調優後重新上線,大家可以看看最終效果

JVM調優-微服務的記憶體之痛#JVM調優

相較于最開始的800M記憶體,我們比之前富餘了2.4G記憶體,并且每個服務都能保證正常運作(見下圖服務注冊中心)

JVM調優-微服務的記憶體之痛#JVM調優

剩餘的記憶體足夠再上6~8個服務了,作為測試環境應該是足夠了.

再不行就必須換伺服器了.[手動滑稽臉]

–完--