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来构建镜像

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

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

CPU测试

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

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

启动两个容器,不同配额

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

  1. [root@node ~]# docker run -it stress:v1 --cpu 1
  2. stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
  3. # 再开一个终端
  4. [root@node ~]# docker run -it stress:v1 -c 512 --cpu 1
  5. stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
  6. # 再开一个终端 top查看
  7. [root@node ~]# top
  8. top - 15:04:02 up 3 min, 3 users, load average: 1.23, 0.37, 0.13
  9. Tasks: 109 total, 4 running, 49 sleeping, 0 stopped, 0 zombie
  10. %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
  11. KiB Mem : 985712 total, 588760 free, 173244 used, 223708 buff/cache
  12. KiB Swap: 2097148 total, 2097148 free, 0 used. 612468 avail Mem
  13. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  14. 1575 root 20 0 7320 96 0 R 50.9 0.0 0:36.96 stress
  15. 1618 root 20 0 7320 96 0 R 50.9 0.0 0:21.13 stress

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

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

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

  1. # 指定CPU=0
  2. [root@node ~]# docker run -it --rm --cpuset-cpus=0 stress:v1 --cpu 1
  3. stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
  4. # 打开另一个终端top查看
  5. [root@node ~]# top
  6. top - 15:20:14 up 11 min, 2 users, load average: 0.26, 0.14, 0.05
  7. Tasks: 131 total, 3 running, 57 sleeping, 0 stopped, 0 zombie
  8. %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
  9. %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
  10. %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
  11. %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
  12. KiB Mem : 4016292 total, 3604620 free, 174116 used, 237556 buff/cache
  13. KiB Swap: 2097148 total, 2097148 free, 0 used. 3564852 avail Mem
  14. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  15. 2139 root 20 0 7320 96 0 R 100.0 0.0 0:06.22 stress
  16. # 在重新启动一个容器,指定CPU=1
  17. [root@node ~]# docker run -it --rm --cpuset-cpus=1 stress:v1 --cpu 1
  18. stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
  19. [root@node ~]# top
  20. top - 15:20:24 up 11 min, 2 users, load average: 0.30, 0.15, 0.06
  21. Tasks: 132 total, 3 running, 57 sleeping, 0 stopped, 0 zombie
  22. %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
  23. %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
  24. %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
  25. %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
  26. KiB Mem : 4016292 total, 3601400 free, 177012 used, 237880 buff/cache
  27. KiB Swap: 2097148 total, 2097148 free, 0 used. 3561756 avail Mem
  28. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  29. 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的内存对启动的容器进行压测

  1. [root@node ~]# docker run -it --rm -m 128m stress:v1 --vm 1 --vm-bytes 128m --vm-hang 0
  2. stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
  3. ^Cstress: FAIL: [1] (415) <-- worker 7 got signal 2
  4. stress: WARN: [1] (417) now reaping child worker processes
  5. stress: FAIL: [1] (421) kill error: No such process
  6. stress: FAIL: [1] (451) failed run completed in 5s
  7. # 上面先压测的128m内存,可以正常运行
  8. [root@node ~]# docker run -it --rm -m 128m stress:v1 --vm 1 --vm-bytes 256m --vm-hang 0
  9. stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
  10. stress: FAIL: [1] (415) <-- worker 7 got signal 9
  11. stress: WARN: [1] (417) now reaping child worker processes
  12. stress: FAIL: [1] (421) kill error: No such process
  13. stress: FAIL: [1] (451) failed run completed in 0s
  14. # 上面压测的265m内存,启动后就直接被kill退出了

5、Docker 核心原理-资源隔离和限制的更多相关文章

  1. docker核心原理

    容器概念. docker是一种容器,应用沙箱机制实现虚拟化.能在一台宿主机里面独立多个虚拟环境,互不影响.在这个容器里面可以运行着我饿们的业务,输入输出.可以和宿主机交互. 使用方法. 拉取镜像 do ...

  2. Docker实践(5)—资源隔离

    Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...

  3. Docker容器技术的核心原理

    目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ...

  4. Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案

    注:本文以hadoop-2.5.0-cdh5.3.2为例进行说明.   Hadoop Yarn的资源隔离是指为运行着不同任务的“Container”提供可独立使用的计算资源,以避免它们之间相互干扰.目 ...

  5. Kafka Topic Partition Replica Assignment实现原理及资源隔离方案

    本文共分为三个部分:   Kafka Topic创建方式 Kafka Topic Partitions Assignment实现原理 Kafka资源隔离方案   1. Kafka Topic创建方式 ...

  6. 资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统

    资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是资源隔离 资源隔离是指为不同任务提供可独立使用的计算资源以 ...

  7. Docker 基本核心原理

    Docker内核知识 namespace资源隔离 namespace的6项隔离 NameSpace 系统调用参数 隔离内容 UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWI ...

  8. [转]Greenplum 资源隔离的原理与源码分析

    摘要: 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的 ...

  9. Docker 容器资源隔离 namespace(十)

    目录 一.简介 Linux Namespace的6大类型 二.Mount Namespace 三.IPC Namespace 四.Network Namespace 五.UTS Namespace 六 ...

随机推荐

  1. Python安装pyinstaller方法,以及将项目生成可执行程序的步骤

    pyinstaller安装方法 前提:确保计算机安装了Python语言环境,并且正确配置了环境变量. 方法一:联网在线自动安装 选择一 Windows OS下进入cmd(命令行窗口) 输入:pip i ...

  2. 数据存储之非关系型数据库存储----MongoDB存储

    MongoDB存储----文档型数据库 利用pymongo连接MongoDB import pymongo client = pymongo.MongoClient(host='localhost', ...

  3. SpringBoot中在除Controller层 使用Validation的方式

    说明:Validation 在Controller层使用Validation应该都使用过了,以下方式可以使用 Validation 在Service层完成对dto的属性校验,避免写一堆的 if els ...

  4. 【Linux】【自学笔记】docker搭建一个spring-boot程序

    写在开始    最近捣腾Linux,安装虚拟机VMware并安装了CentOS 7系统,开始研究Linux,但是无从下手,就结合工作中用到的东西一步一步研究,事实并不是那么顺利.特此开博客,记录在过程 ...

  5. win10环境下配置openCV+pycharm+python3.6

    转载地址:https://blog.csdn.net/u010429424/article/details/73649985 Pycharm + OpenCV3 + Python3 配置记录 引言: ...

  6. StringBuffer 和 StringBuilde

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  7. 最新JetBrainsPyCharm自动部署Python(Django,tornado等)项目至远程服务器

    每次开发Python项目时,对于所有Python开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP ...

  8. re模块的基本使用

    目录 re模块 常用元字符 特殊构造 贪婪模式 非贪婪模式 re的常用函数 re模块补充 关于re模块必须知道的知识点 re模块 re模块 , 即正则表达式 , 本身是一种小型的.高度专业化的编程语言 ...

  9. drf

    跨域同源 django做跨域同源 需要把csrf去掉 跨站请求伪造 同源 同源机制:域名.协议.端口号相同的同源 简单请求 不写头部请求 跨域会拦截报错缺少请求信息 (1) 请求方法是以下三种方法之一 ...

  10. 本地存储localstorage

    小小插件,封装了一个存取删 <script type="text/javascript"> /* *getItem(name) * *setItem(name,valu ...