前言

Docker系列文章:

此篇是Docker系列的第十篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,马上就开始Kubernetes,加油!一起前行!

  1. 为什么要学习Docker
  2. Docker基本概念
  3. Docker镜像基本原理
  4. Docker容器数据卷
  5. Dockerfile
  6. Docker单机网络上
  7. Docker单机网络下
  8. Docker单机网络实战
  9. Docker隔离技术

隔离的问题

之前我们做的Demo都没有使用限制,这个时候我们使用stats命令来看下整体资源的使用情况;

docker stats

img

这个时候我们可以看到容器是可以使用到宿主机的所有的资源,这也是基于Linux Namespace的隔离机制相比于虚拟化技术的不足之处,就是对资源的隔离不够彻底,当一个宿主机上运行多个容器的时候,容器是共享宿主机的CPU和内存,这个时候如果某XX程序写了一个内存溢出的程序部署到容器中,这个时候就会影响到同一台宿主机的其他容器,那么对于这个问题我们该如何解决?

Cgroups

Linux Cgroups的全称是Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,Cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,Cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。也就是说开发者可以通过 Cgroups 提供的精细化控制能力,限制某一个或者某一组进程的资源使用。

Cgroups的主要作用

实现 Cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,Cgroups 提供了四大功能:

  1. 资源限制:Cgroups 可以对进程的资源总额进行限制;

  2. 优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级;

  3. 资源统计:Cgroups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等;

  4. 任务控制:Cgroups 可以对任务执行挂起、恢复等操作;

Cgroups文件系统探索

在Linux中,Cgroups给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下,我们可以通过 mount 命令来查看 Cgroups 默认的挂载点:

mount | grep cgroup

image.png

输出的结果是一系列文件系统目录(如果你在自己的机器上没有看到这些目录,那你就需要自己去挂载Cgroups)。

让我们来使用ll命令看一下 /sys/fs/cgroup目录下包含哪些子目录,

ll /sys/fs/cgroup

image.png

在/sys/fs/cgroup目录包括cpuset、cpu、 memory这样的子目录,这些都是我这台机器当前可以被Cgroups进行限制的资源种类,接下来我们深入到memory的子目录下看下该目录下都有什么:


image.png

这些文件就是 Cgroups 的 memory 子系统中的根级设置。比如 memory.limit_in_bytes 中的数字用来限制进程的最大可用内存,memory.swappiness 中保存着使用 swap 的权重等等。

既然 Cgroups 是以这些文件作为 API 的,那么我就可以通过创建或者是修改这些文件的内容来限制进程的资源,接下来我们就来在展示下如何使用Cgroups。

如何使用Cgroups

该案例是限制进程可以用的CPU

  1. 在 /sys/fs/cgroup/cpu目录下新建一个名称为limit_cpu的目录;

    #进入对应的目录
    cd /sys/fs/cgroup/cpu
    #新建文件夹
    mkdir limit_cpu
  2. 查看新建文件的目录,我们可以发现系统已经帮我们自动创建的以下目录,也就是说明了Cgroups 的文件系统会在创建文件目录的时候自动创建这些配置文件;

    cd limit_cpu/
    ls

    image.png
  3. 我们通过配置将CPU周期限制为总量的十分之一;

    #设置CPU period的周期的100ms(100000 us),该值也是默认的值
    echo 100000 > cpu.cfs_period_us
    #设置CPU的配额为10ms(10000 us),这样就是为总量的十分之一
    echo 10000 > cpu.cfs_quota_us
  4. 切换/usr/local目录下,新建cputime.c文件,编写如下相加程序;

    #切换目录
    cd /usr/local
    #新建文件
    touch cputime.c
    #编辑文件
    vim cputime.c

    void main(){
        unsigned int i, end;

        end = 1024 * 1024 * 1024;
        for(i = 0; i < end; )
        {
            i ++;
        }
    }
  5. 编译程序

    gcc cputime.c -o cputime
  6. 使用不同的CPU限制,对比执行时间执行时间,通过对比我们可以发现限制的CPU使用时间大概是我们不使用限制下的时间的10倍,说明我们限制是生效的;

    #CentOS系统需要安装libcgroup-tools包,才有cgroup配置命令
    yum install -y libcgroup-tools.x86_64
    #无限制下的CPU执行时间
    time ./cputime
    #使用limit_cpu限制下的CPU执行时间
    time cgexec -g cpu:limit_cpu ./cputime

    image.png

总结一下,Linux Cgroups 就是一个子系统目录加上一组资源限制文件的组合。

Docker限制探究

使用

使用如下命令启动,看到--cpu-period和--cpu-quota相信你会感到熟悉,这不是和我们上面使用限制CPU时候的参数配置基本上是一样,这个时候我们怀疑Docker的限制可能使用Cgroups的技术,接下来我们就探究下是不是这样的。

docker run -it -d --cpu-period=100000 --cpu-quota=20000 --memory 1000M --name limitcentos centos:latest

我们使用docker stats查看docker资源使用情况,会发现limitcentos的内存以及被限制到1000M了。

docker stats

image.png

原理探究

通过参数我们猜测可能Docker的限制可能使用Cgroups的技术,验证的最好的办法就是去找下Cgroups的目录结构,接下来我们分别看CPU的目录是否存在docker的限制。

  1. 进入Cgroups的cpu目录,我们会发现拖多出docker的目录;

    cd /sys/fs/cgroup/cpu
    ls

    img
  2. 进入docker目录,看到蓝色部分我们会想到docker启动成功以后返回一串字符串,确实蓝色部分就是代表Docker,最后那张图是limitcentos启动后返回的,我们可以看到他们是一致的;


    img

    img
  3. 进入limitcentos的对应的目录,我们会发现其目录和CPU限制的是基本一致的;


    image.png
  4. 接下来我们查看下cfs_period_us和cfs_quota_us的内容是否和docker启动的参数一致,经过验证发现是一致的;

    #查看周期
    cat cpu.cfs_period_us
    #查看限制
    cat cpu.cfs_quota_us

    image.png

经过demo验证,证实了Docker的限制就是使用Cgroups的技术。

结束

欢迎大家点点关注,点点赞!

Docker限制的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. Pytest学习笔记5-conftest.py的用法

    前言 在之前介绍fixture的文章中,我们使用到了conftest.py文件,那么conftest.py文件到底该如何使用呢,下面我们就来详细了解一下conftest.py文件的特点和使用方法吧 什 ...

  2. 使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine

    1.环境 win7 x64,oracle 11g r2,jdk6 x64 2.问题 第一次启动Oracle SQL Developer的时候会让我们填写java.exe的路径,我在jdk安装目录下的b ...

  3. 案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/118685521 长期持续带来更多项目与技术分享 ...

  4. 第三章 - CPU缓存结构和java内存模型

    CPU 缓存结构原理 CPU 缓存结构 查看 cpu 缓存 速度比较 查看 cpu 缓存行 cpu 拿到的内存地址格式是这样的 CPU 缓存读 根据低位,计算在缓存中的索引 判断是否有效 0 去内存读 ...

  5. 在Intellij IDEA中新建Web项目

    1.点击左上角 文件(F) ,--> new  --> 项目 2.勾选下面的复选框,下一步就是给项目起名字和存放项目的位置 2.在Web文件下新建 clsses 和 lib文件夹:http ...

  6. Archive for required library:’ WebRoot/WEB-INF/Mytag.tld’in project ‘TagTest’ cannot be read or is not a valid ZIP file

    Description::部署tld文件时报错 我的解决方法: 右击(当前项目)->Build Path->Java Build Path ( Configure Build Path.. ...

  7. ABP Framework 为什么好上手,不好深入?探讨最佳学习姿势!

    离写上一篇经验总结 ABP Framework 研习社经验总结(6.28-7.2) ,已经过去两周. ABP Framework 研习社(QQ群:726299208) 最近一周,又迎来了很多新伙伴,成 ...

  8. cke编辑器插入&ZeroWidthSpace占位字符的问题记录

    背景 本博文主要记录在使用cke编辑器时,遇到的一系列的问题 问题1:在执行某些业务操作后,编辑器会偶现在页面头部或者尾部插入&ZeroWidthSpace占位符(编辑器好像就爱干这事~) 解 ...

  9. 3.Java入门

    一.Java帝国的诞生 一场旷日持久的战争 1.C & C++ 1972年C诞生 贴近硬件(有汇编的一些特点),运行极快,效率极高 操作系统,编译器,数据库,网络系统等 指针(能够直接操作内存 ...

  10. vs2013恢复默认设置

    选择 工具->import or export settings(工具->导入导出设置),选择最下面一项即可