在微服务体系中,我们使用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,减少内存溢出的发生。

 

posted on 2024-04-29 17:00  song.yan  阅读(5)  评论(0编辑  收藏  举报