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退出了

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. Linux常见命令之文件处理命令

    ls命令 ls(选项)(参数) 选项 -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出): -A:显示除影藏文件“.”和“..”以外的所有文件列表: -C:多列显示输出 ...

  2. Method Not Allowed (GET): /boxuegos/index/ 错误

    1,Method Not Allowed (GET) 请求方法不被允许, 错误原因:我调用的是index这个方法,但是我上面定义了一个空的子路由,所以页面加载不了,控制台出现Method Not Al ...

  3. Vue---mock.js 使用

    mockjs 概述 在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数 ...

  4. git log 附加命令归纳

    git查看历史记录的时候查看每次提交的内容差异: git log -p git限制显示的条数 : git log -p -2 [-2] git简单显示每次提交做了哪些改动: git log --sta ...

  5. MySQL8.0 redo日志系统优化

    背景 现在主流的数据库系统的故障恢复逻辑都是基于经典的ARIES协议,也就是基于undo日志+redo日志的来进行故障恢复.redo日志是物理日志,一般采用WAL(Write-Ahead-Loggin ...

  6. ISCONF Redis is configured to save RDB snapshots

    MISCONF Redis is configured to save RDB snapshots redis报错: (error) MISCONF Redis is configured to sa ...

  7. 大数据之路day02_1--运算符

    运算符这一节主要是介绍算数运算符.赋值运算符.比较运算符.逻辑运算符.三元运算符.接下来一一介绍. 1.算数运算符 ++ 和 -- 的用法 例如:a++ 和 ++a的区别 %的应用场景(取模其实就是取 ...

  8. postman-接口间数据传递

    接口间数据传递 在我们做接口测试过程中会经常碰到使用上一个接口返回数据的情况,jmeter中可通过正则表达式提取,postman中如何提取呢?我们来看实例,这里使用的同一个接口来演示. ​ 我们提取出 ...

  9. 苹果审核ipv6海外解决思路-About APP Store

    原始简书文章地址(也是我自己的) 首先声明,一我不负责涉及你们内部服务器. 二是好好读文章,别人能过,你们也能过 苹果6月1日出的IPV6协议阻碍了国内大多数积极开发者,我司也不外乎,经过三次被拒后, ...

  10. lrd 模拟 总结

    觉得是时候总结一下达哥的考试了!达哥的考试我就没有考好过,就之前达哥的考试都是人家ak我爆零,然后这次也不例外,我总是想在考场上尝试一些新的东西,其实就是作死行为,有的时候这种行为可以为我带来收益但是 ...