• 5、Docker 核心原理-资源隔离和限制


    Docker

    资源隔离

    Docker 是利用linuxLXC技术,内核的Kernel namespace

    Namespace:

    1. PID - 通过PID的namespace隔离,可以嵌套
    2. NET - 通过网络的NET的namespace隔离
    3. IPC - 隔离IPC
    4. mnt - 挂在隔离
    5. Uts - 可以实现每个docker 容器有自己的hostname,daemin name
    6. User - 让每个容器有自己的用户和组

    资源限制

    通过controller group进行

    默认支持隔离的:

    • CPU
    • MEM

    磁盘需要手动来隔离

    配置资源隔离

    Docker默认的每个容器的CPU配额是1024.
    如果一个机器只有一个容器,那么就占所有,如果两个,则是平分

    在进行安装配置的时候,需要用到压力测试工具stress.

    需要在容器中安装测试工具,yum install stress -y,前提有epel源。

    下面使用Dockerfile来构建镜像

    [root@node docker-file]# mkdir stress
    [root@node docker-file]# ls
    nginx  stress
    [root@node stress]# cat Dockerfile 
    FROM centos
    RUN rm -rf /etc/yum.repos.d/*
    ADD CentOS7-Base-163.repo /etc/yum.repos.d
    ADD epel.repo /etc/yum.repos.d/
    RUN yum install stress -y && yum clean all
    ENTRYPOINT ["stress"]
    [root@node stress]# ls
    CentOS7-Base-163.repo  Dockerfile  epel.repo
    [root@node stress]# docker build -t stress:v1 .
    [root@node stress]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
    stress               v1                  14cb1cb325cd        About a minute ago   221 MB
    nginx-file           v1                  592d69098f3a        18 hours ago         399 MB
    sijiayong/my-nginx   v1                  a80ecf40e4d2        19 hours ago         328 MB
    docker.io/centos     latest              5182e96772bf        2 weeks ago          200 MB
    docker.io/nginx      latest              c82521676580        4 weeks ago          109 MB
    docker.io/registry   latest              b2b03e9146e1        6 weeks ago          33.3 MB
    

    可以看到进行已经制作完成。

    CPU测试

    配置1核CPU,让stress进行CPU的压力测试

    # 使用--rm参数,当容器退出时,自动删除该容器。
    [root@node stress]# docker run -it --rm stress:v1 --cpu 1
    stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
    
    # 然后打开一个新的终端,top查看:
    
    [root@node ~]# top
    top - 15:01:48 up 1 min,  3 users,  load average: 0.08, 0.02, 0.01
    Tasks: 108 total,   2 running,  49 sleeping,   0 stopped,   0 zombie
    %Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :   985712 total,   613288 free,   154292 used,   218132 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.   636208 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                 
      1504 root      20   0    7320    100      0 R 93.8  0.0   0:02.80 stress       
    
    

    启动两个容器,不同配额

    启动两个容器,一个容器不指定配额,一个容器指定512的配额,再次查看CPU使用率:

    [root@node ~]# docker run -it stress:v1 --cpu 1
    stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
    
    # 再开一个终端
    
    [root@node ~]# docker run -it stress:v1 -c 512 --cpu 1
    stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
    
    # 再开一个终端 top查看
    
    [root@node ~]# top
    top - 15:04:02 up 3 min,  3 users,  load average: 1.23, 0.37, 0.13
    Tasks: 109 total,   4 running,  49 sleeping,   0 stopped,   0 zombie
    %Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :   985712 total,   588760 free,   173244 used,   223708 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.   612468 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                 
      1575 root      20   0    7320     96      0 R 50.9  0.0   0:36.96 stress                                                                                                                  
      1618 root      20   0    7320     96      0 R 50.9  0.0   0:21.13 stress
    

    此时每个容器占了CPU的一半。

    多个容器使用多个CPU中的一核

    参数 --cpuset-cpus 参数,来制定,从0 开始,可以指定多个,以,都好分割

    # 指定CPU=0
    [root@node ~]# docker run -it --rm --cpuset-cpus=0 stress:v1 --cpu 1
    stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
    
    
    # 打开另一个终端top查看
    [root@node ~]# top
    top - 15:20:14 up 11 min,  2 users,  load average: 0.26, 0.14, 0.05
    Tasks: 131 total,   3 running,  57 sleeping,   0 stopped,   0 zombie
    %Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  4016292 total,  3604620 free,   174116 used,   237556 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  3564852 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                
      2139 root      20   0    7320     96      0 R 100.0  0.0   0:06.22 stress 
    
    # 在重新启动一个容器,指定CPU=1
    
    [root@node ~]# docker run -it --rm --cpuset-cpus=1 stress:v1 --cpu 1
    stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
    
    [root@node ~]# top
    top - 15:20:24 up 11 min,  2 users,  load average: 0.30, 0.15, 0.06
    Tasks: 132 total,   3 running,  57 sleeping,   0 stopped,   0 zombie
    %Cpu0  :  0.0 us,  1.1 sy,  0.0 ni, 98.9 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,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  4016292 total,  3601400 free,   177012 used,   237880 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  3561756 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                
      2246 root      20   0    7320    100      0 R 100.0  0.0   0:02.99 stress
    

    可以看到,docker把对应的容器运行那颗CPU上了


    内存资源限制

    --memory-swap --memory 功能
    正数 S 正数 M 容器可用内存总空间为S,其中ram为M. swap为(S-M),若S=M,则无可用swap资源
    0 正数 M 相当于未设置swap(unset)
    unset 正数 M 若主机(Docker Host)启用了swap,则容器的可用swap为2*M
    -1 正数 M 若主机(Docker Host)启用了swap,则容器可使用最大至宿主机上的所有swap空间的swap资源

    注意:在容器内使用free命令可以看到的swap空间并不具有其所展现出的空间只是意义。

    使用 -m 来给容器分配内存,同样使用stress工具,来对容器进行压测

    分配一个128m的内存给容器,然后使用stress运行256m的内存对启动的容器进行压测

    [root@node ~]# docker run -it --rm -m 128m stress:v1 --vm 1 --vm-bytes 128m --vm-hang 0
    stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
    ^Cstress: FAIL: [1] (415) <-- worker 7 got signal 2
    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 5s
    
    # 上面先压测的128m内存,可以正常运行
    
    [root@node ~]# docker run -it --rm -m 128m stress:v1 --vm 1 --vm-bytes 256m --vm-hang 0
    stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
    stress: FAIL: [1] (415) <-- worker 7 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 0s
    
    # 上面压测的265m内存,启动后就直接被kill退出了
    
  • 相关阅读:
    Scrum Works 1.84安装
    使用Sandcastle Styles 来生成VS2008的帮助文档.
    NDoc 用户指南(转)
    第一章 C#语言基础(C# Language Elements)
    SQL Server 2005 中删除重复记录
    SDE 远程连接
    C# 按钮美化技巧
    SOP 中的 Service
    C# DateTime赋值为null
    C# WebBrowser显示html字符串
  • 原文地址:https://www.cnblogs.com/winstom/p/9530195.html
Copyright © 2020-2023  润新知