在微服務體系中,我們使用docker去部署微服務,在伺服器資源有限的情況下。由於某個的服務(docker容器)cpu使用過高,或者記憶體使用過高會導致整個的伺服器的崩潰。
針對這個問題,我採取了以下措施:
在docker run命令中新增 --cpus=2 --memory=4g
--cpus=2:設定cpu最多使用2個核心數
--memory=4g :設定記憶體最多使用4g
************************
那cpu上限,記憶體上限是否可以隨意設定呢。設定的標準是什麼呢。除了對容器的使用上限有影響,還有沒有其他的影響呢?
(1)設定的標準是什麼?
下限:我們在設定上限之前一定要了解服務正常工作所需要的cpu,記憶體上限。設定的值不能小於實際執行允許的上限。
上限:伺服器整體的資源有限,要考慮整個伺服器可用的資源,以及其他服務部署所需要的最小資源,保證其他服務夠用的基礎上確定上限。
(2)是否有其他的影響?
如果在一個cpu只有20個核心數的伺服器,部署20個服務,每個服務設定--cpus=5,每個服務的cpu是如何被限制的呢?在預設配置下,容器共需要20*5=100個cpu,實際只有20。所以每個容器並不會分到5個cpu。
在這種情況下,單個容器可以被分到的最大CPU上限實際上是由伺服器上可用的CPU核心數和容器之間的資源爭用情況共同決定的。由於每個容器都設定了相同的CPU限制(--cpus=5
),Docker和宿主機的作業系統會嘗試在所有執行中的容器之間公平地分配CPU時間。
理想情況下,如果所有容器都同時執行並嘗試使用盡可能多的CPU資源,每個容器理論上可以獲得的CPU時間將大致等於伺服器總核心數(20核)除以執行中的容器數量(20個)。這意味著每個容器可能只能獲得相當於1個核心的CPU時間。然而,實際情況可能因作業系統的排程策略、其他系統程序的資源佔用以及容器內部的工作負載特性而有所不同。
因此,在上述例子中,單個容器可以被分到的最大CPU上限在理想情況下大約是1個核心的計算能力(即100%的CPU使用率,相對於單個核心而言)。但請注意,這是一個理論上的計算,並且實際情況可能因多種因素而有所不同。
*****************************
另外一種防止容器內服務記憶體佔用過多策略:GC
在docker 的 dockerfile中 java jar 命令中新增對堆記憶體等各種記憶體的限制,在記憶體達到指定值時進行gc,減少記憶體溢位的發生。