• docker19.03限制容器使用的内存资源


    一,指定内存大小的参数:

    [root@localhost liuhongdi]# docker run -idt --name kafka2 --hostname kafka2 -m 200M --memory-swap 230M --privileged kafka:0.1 /usr/sbin/init
    5286d44361bfffcb334044f02b7ebe2399a7949aa5d139b1f226e7813a1b3e35

    参数:

    -m 或 --memory:设置内存的使用限额,例如 100M, 2G
    
    –memory-swap:设置 内存+swap 的使用限额

    注意:

    1,默认情况下,memory和memory-swap参数的值为 -1,即对容器内存和 swap 的使用没有限制。

    2,如果在启动容器时只指定 -m 而不指定 --memory-swap,

       那么 --memory-swap 默认为 -m 的两倍,比如:

       docker run -it -m 200M ubuntu

       容器最多使用 200M 物理内存和 200M swap

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

     说明:作者:刘宏缔 邮箱: 371125307@qq.com

    二,从docker inspect中可以看到设置值:

    1,docker inspect查看memory

    [root@localhost liuhongdi]# docker inspect kafka2 | grep -i memory
                "Memory": 209715200,
                "KernelMemory": 0,
                "KernelMemoryTCP": 0,
                "MemoryReservation": 0,
                "MemorySwap": 241172480,
                "MemorySwappiness": null,

    2,docker inspect查看memory+swap

    [root@localhost liuhongdi]# docker inspect kafka2 | grep -i memoryswap
                "MemorySwap": 241172480,
                "MemorySwappiness": null,

    三,用docker stats中查看内存限额:

    [root@localhost liuhongdi]# docker stats kafka2 --no-stream
    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
    5286d44361bf        kafka2              0.02%               57.62MiB / 200MiB   28.81%              12.5MB / 222kB      19.7MB / 1.15MB     5

    LIMIT一项是我们指定的内存限额数量

    四,在容器中测试内存占用的限额是否起作用?

    1,

    在容器中安装stress

    [root@kafka2 source]# wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/s/stress-1.0.4-16.el7.x86_64.rpm
    [root@kafka2 source]# rpm -ivh stress-1.0.4-16.el7.x86_64.rpm

    2,执行测试:

    [root@kafka2 source]# stress --vm 1 --vm-bytes 280M
    stress: info: [261] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
    stress: FAIL: [261] (415) <-- worker 262 got signal 9
    stress: WARN: [261] (417) now reaping child worker processes
    stress: FAIL: [261] (451) failed run completed in 6s
    [root@localhost liuhongdi]# 

    线程报错,容器退出了

    因为280M超出最大200M的限额

    3, stress命令两个参数的含义:

    -m --vm n 产生n个进程,每个进程不断调用内存分配malloc和内存释放free函数

       --vm-bytes B 指定malloc时内存的字节数 (默认256MB)

       --vm-hang N 指示每个消耗内存的进程在分配到内存后转入休眠状态,与正常的无限分配和释放内存的处理相反,

                          这有利于模拟只有少量内存的机器

    4,用docker ps -a查看

    [root@localhost liuhongdi]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
    5286d44361bf        kafka:0.1           "/usr/sbin/init"    16 minutes ago      Exited (137) 4 minutes ago                       kafka2

    状态成了 :Exited

    5,说明:生产环境中,对docker进行内存限额非常重要,

    否则很容易出现容器给整个主机造成oom

    五,查看docker的版本:

    [root@localhost liuhongdi]# docker --version
    Docker version 19.03.8, build afacb8b
  • 相关阅读:
    Notepad++ 配置信息导出导入(快捷键配置导出导入等等)
    SQL 删除重复数据
    PostgreSQL Update 根据B表更新A表
    桌面应用基本创建流程
    Android shape和selector完全总结
    Android 第三方框架之Charts
    java常见五种排序方式
    Objective-c之字典精讲
    OC语言之---NSArray
    Objective-c编程之NSString精讲
  • 原文地址:https://www.cnblogs.com/architectforest/p/12586336.html
Copyright © 2020-2023  润新知