k8s容器的內(nèi)存設置的踩坑記錄
問題場景
通過k8s啟動了一個容器,容器中運行了一個java應用及日志跟蹤服務,在運行過程中發(fā)現(xiàn)容器經(jīng)常重啟,重啟的原因為:cgroup out of memory。
運行指標
k8s容器內(nèi)存限制:4G;jvm最大內(nèi)存設置:3.2G。
問題分析
1) jvm內(nèi)存溢出了;
2) 容器內(nèi)存溢出了。
過程跟蹤
1) 通過跟蹤jvm內(nèi)存的占用情況,模擬應用請求,發(fā)現(xiàn)在容器被killed時,jvm內(nèi)存正常。

2) 查看容器運行的宿主服務器日志,/var/log/message,查看結(jié)束條件。 初步分析,容器內(nèi)存確實超出最大內(nèi)存限制:4G。如下圖。

3)初步分析,在容器被killed時,jvm是運行正常的,而容器運行需要的其他內(nèi)存空間不夠,導致容器整體內(nèi)存占用大于4G;linux系統(tǒng)基于內(nèi)存占用評分機制,找出占用內(nèi)存使用最大的進程,將進行殺掉了;容器被刪掉后,k8s通過調(diào)度重新啟動了容器實例。
如何設置容器的總內(nèi)存大小呢?
容器的總內(nèi)存 = 應用程序內(nèi)存 + 容器服務內(nèi)存。對于java程序,jvm內(nèi)存大小,可以通過jvm調(diào)參和jvm監(jiān)控,尋找最合適的內(nèi)存大小參數(shù);對于容器服務內(nèi)存,可以基于k8s的彈性機制進行設置,大小可默認為應用程序內(nèi)存的1/2。
1) jvm內(nèi)存大小調(diào)試,對于后臺管理或后臺任務調(diào)度類,jvm內(nèi)存溢出場景參數(shù)為:jvm老年代內(nèi)存占滿,并且垃圾回收次數(shù)不斷增加,CPU占用率幾乎100%。
JVM內(nèi)存參數(shù)建議還是使用-Xms、-Xmx進行設置,不建議使用-XX:MaxRAMPercentage -XX:InitialRAMPercentage -XX:MinRAMPercentage設置。因為-Xms、-Xmx是基于應用程序功能調(diào)優(yōu)后的值,如果根據(jù)容器內(nèi)存大小隨意變更,效果可能適得其反。

2) 容器服務內(nèi)存可以在保證應用程序正常運行的情況下,根據(jù)實際情況調(diào)整。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Podman開機自啟容器實現(xiàn)過程及與Docker對比
這篇文章主要為大家介紹了Podman開機自啟容器實現(xiàn)過程,通過示例代碼的形式進行演繹過程,有需要的朋友可以參考下,希望可以有所幫助2021-09-09
關于CentOS7日志文件及journalctl日志查看方法
這篇文章主要介紹了關于CentOS7日志文件及journalctl日志查看方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
基于云服務MRS構建DolphinScheduler2調(diào)度系統(tǒng)的案例詳解
這篇文章主要介紹了基于云服務MRS構建DolphinScheduler2調(diào)度系統(tǒng),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05

