Docker(八)资源隔离和限制

  • A+
所属分类:Docker

  在使用 docker 运行容器时,一台主机上可能会运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。

  docker 作为容器的管理者,自然提供了控制容器资源的功能。正如使用内核的 namespace 来做容器之间的隔离,docker 也是通过内核的cgroups来做容器的资源限制。这篇文章就介绍如何使用 docker 来限制 CPU、内存和 IO,以及对应的 cgroups 文件。

cgroups介绍

  cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对cpu,内存等资源实现精细化的控制,下面是一个博客的介绍链接:http://blog.csdn.net/hzrandd/article/details/52484332

Namespaces(命名空间)机制提供一种资源隔离方案,介绍链接:https://www.cnblogs.com/cherishui/p/4237883.html

下载stress压力测试镜像

[root@py ~]# docker pull joedval/stress
[root@py ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/joedval/stress      latest              89e5b79daa74        23 months ago       214.9 MB

限制CPU

运行一个压力测试容器,强制cpu使用一核

docker run -it --rm docker.io/joedval/stress --cpu 1

强制容器使用cpu1-2核

docker run -it --rm --cpuset-cpus="1,2" docker.io/joedval/stress

宿主机查看CPU使用情况,发现一核CPU已经跑满

[root@py ~]# top
top - 00:53:47 up 3 days, 23:54,  4 users,  load average: 2.24, 11.82, 6.85
Tasks: 431 total,   2 running, 429 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  1.7 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2865548 total,   495536 free,   283436 used,  2086576 buff/cache
KiB Swap:  2097148 total,  2097144 free,        4 used.  2157940 avail Mem
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                         
116121 root      20   0    7260     88      0 R 100.0  0.0   0:07.80 stress

限制内存

如果限制容器的内存使用为 64M,在申请 64M 资源的情况下,容器运行正常

[root@py ~]# docker run --rm -it -m 64m docker.io/joedval/stress --vm 1 --vm-bytes 64M --vm-hang 0
WARNING: IPv4 forwarding is disabled. Networking will not work.
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

而如果申请 160M 内存,内存溢出,会发现容器里的进程被 kill 

[root@py ~]# docker run --rm -it -m 64m docker.io/joedval/stress --vm 1 --vm-bytes 164M --vm-hang 0
WARNING: IPv4 forwarding is disabled. Networking will not work.
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (415) <-- worker 6 got signal 9
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 1s

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: