Docker原理之CGroups

  • 控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计 等。
  • 只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
  • 控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。
  • 控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。

我们通过 Linux 的命名空间为新创建的进程隔离了文件系统、网络并与宿主机器之间的进程相互隔离,但是命名空间并不能够为我们提供物理资源上的隔离,比如 CPU 或者内存,如果在同一台机器上运行了多个对彼此以及宿主机器一无所知的『容器』,这些容器却共同占用了宿主机器的物理资源。

12.png

如果其中的某一个容器正在执行 CPU 密集型的任务,那么就会影响其他容器中任务的性能与执行效率,导致多个容器相互影响并且抢占资源。如何对多个容器的资源使用进行限制就成了解决进程虚拟资源隔离之后的主要问题,而 Control Groups(简称 CGroups)就是能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。

每一个 CGroup 都是一组被相同的标准和参数限制的进程,不同的 CGroup 之间是有层级关系的,也就是说它们之间可以从父类继承一些用于限制资源使用的标准和参数。

13.png

Linux 的 CGroup 能够为一组进程分配资源,也就是我们在上面提到的 CPU、内存、网络带宽等资源,通过对资源的分配,CGroup 能够提供以下的几种功能:

14.png

在 CGroup 中,所有的任务就是一个系统的一个进程,而 CGroup 就是一组按照某种标准划分的进程,在 CGroup 这种机制中,所有的资源控制都是以 CGroup 作为单位实现的,每一个进程都可以随时加入一个 CGroup 也可以随时退出一个 CGroup。

Linux 使用文件系统来实现 CGroup,我们可以直接使用下面的命令查看当前的 CGroup 中有哪些子系统:

$ lssubsys -m
cpuset /sys/fs/cgroup/cpuset
cpu /sys/fs/cgroup/cpu
cpuacct /sys/fs/cgroup/cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb

大多数 Linux 的发行版都有着非常相似的子系统,而之所以将上面的 cpuset、cpu 等东西称作子系统,是因为它们能够为对应的控制组分配资源并限制资源的使用。

如果我们想要创建一个新的 cgroup 只需要在想要分配或者限制资源的子系统下面创建一个新的文件夹,然后这个文件夹下就会自动出现很多的内容,如果你在 Linux 上安装了 Docker,你就会发现所有子系统的目录下都有一个名为 Docker 的文件夹:

$ ls cpu
cgroup.clone_children  
...
cpu.stat  
docker  
notify_on_release 
release_agent 
tasks$ ls cpu/docker/
9c3057f1291b53fd54a3d12023d2644efe6a7db6ddf330436ae73ac92d401cf1 
cgroup.clone_children  
...
cpu.stat  
notify_on_release 
release_agent 
tasks

9c3057xxx 其实就是我们运行的一个 Docker 容器,启动这个容器时,Docker 会为这个容器创建一个与容器标识符相同的 CGroup,在当前的主机上 CGroup 就会有以下的层级关系:

15.png

每一个 CGroup 下面都有一个 tasks 文件,其中存储着属于当前控制组的所有进程的 pid,作为负责 cpu 的子系统,cpu.cfs_quota_us 文件中的内容能够对 CPU 的使用作出限制,如果当前文件的内容为 50000,那么当前控制组中的全部进程的 CPU 占用率不能超过 50%。

如果系统管理员想要控制 Docker 某个容器的资源使用率就可以在 docker 这个父控制组下面找到对应的子控制组并且改变它们对应文件的内容,当然我们也可以直接在程序运行时就使用参数,让 Docker 进程去改变相应文件中的内容。

$ docker run -it -d --cpu-quota=50000 busybox
53861305258ecdd7f5d2a3240af694aec9adb91cd4c7e210b757f71153cdd274
$ cd 53861305258ecdd7f5d2a3240af694aec9adb91cd4c7e210b757f71153cdd274/
$ ls
cgroup.clone_children  cgroup.event_control  cgroup.procs  cpu.cfs_period_us  cpu.cfs_quota_us  cpu.shares  cpu.stat  notify_on_release  tasks
$ cat cpu.cfs_quota_us
50000

当我们使用 Docker 关闭掉正在运行的容器时,Docker 的子控制组对应的文件夹也会被 Docker 进程移除,Docker 在使用 CGroup 时其实也只是做了一些创建文件夹改变文件内容的文件操作,不过 CGroup 的使用也确实解决了我们限制子容器资源占用的问题,系统管理员能够为多个容器合理的分配资源并且不会出现多个容器互相抢占资源的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker原理之UnionFS

一、UnionFS Linux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。 镜像到底是什么&#…

Docker使用-构建MySQL

拉取官方镜像(我们这里选择5.7,如果不写后面的版本号则会自动拉取最新版) docker pull mysql:5.7 # 拉取 mysql 5.7 docker pull mysql # 拉取最新版mysql镜像MySQL文档地址 检查是否拉取成功 $ sudo docker images一般来说数据库容…

Java集合:什么是Java集合?

一、集合的由来 通常,我们的Java程序需要根据程序运行时才知道创建了多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要…

Java集合:Map集合

一、简述 public interface Map<K,V>将键映射到值的对象。一个映射不能包含重复的键&#xff1b;每个键最多只能映射到一个值。 注意&#xff1a;Map中的集合不能包含重复的键&#xff0c;值可以重复。每个键只能对应一个值。 Map集合是键值对形式存储值的&#xff0c…

用离线编辑器Zoundry写zblog日志

Zoundry是免费的离线网志发布工具&#xff0c;由于家里的网络很差&#xff0c;写了一半的日志经常因为掉线而丢失&#xff0c;这样一款软件的确是很必要的。今天下载试用了一下&#xff0c;感觉的确不错。使用起来也很简单&#xff1a; 1.下载并安装zoundry软件&#xff1a;现…

Flume简单介绍

在一个完整的离线大数据处理系统中&#xff0c;除了HDFSMapReduceHive组成分析系统的核心之外&#xff0c;还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统&#xff0c;而这些辅助工具在hadoop生态体系中都有便捷的开源框架&#xff0c;在此&#xff0c;我们首先来…

Java并发篇_线程详解

线程&#xff08;thread&#xff09; 是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务。 一、线程的…

Spark-大规模数据处理计算引擎

官网&#xff1a;http://spark.apache.org 一、Spark是什么 Spark是一种快速、通用、可扩展的大数据分析引擎&#xff0c;2009年诞生于加州大学伯克利分校AMPLab&#xff0c;2010年开源&#xff0c;2013年6月成为Apache孵化项目&#xff0c;2014年2月成为Apache顶级项目。项目是…

CentOS7下Spark集群的安装

从物理部署层面上来看&#xff0c;Spark主要分为两种类型的节点&#xff0c;Master节点和Worker节点&#xff0c;Master节点主要运行集群管理器的中心化部分&#xff0c;所承载的作用是分配Application到Worker节点&#xff0c;维护Worker节点&#xff0c;Driver&#xff0c;Ap…

Scala变量和常用数据类型

一、 声明值和变量 Scala声明变量有两种方式&#xff0c;一个用val&#xff0c;一个用var。 声明方式&#xff1a;val / var 变量名 : 变量类型 变量值 val定义的值是不可变的&#xff0c;它不是一个常量&#xff0c;是不可变量&#xff0c;或称之为只读变量。 val示例&am…

(转)JVM监控工具介绍

2008年03月04日 16:57原作者&#xff1a; stone2083 原文地址&#xff1a;http://www.blogjava.net/stone2083/archive/2008/02/25/182081.htmljstatd启动jvm监控服务。它是一个基于rmi的应用&#xff0c;向远程机器提供本机jvm应用程序的信息。默认端口1099。实例&#xff1a;…

【Kubernetes】控制器Statefulset

Statefulset控制器 一、概念二、Statefulset资源清单文件编写技巧2.1、查看定义Statefulset资源需要的字段2.2、查看statefulset.spec字段如何定义2.3、查看statefulset的spec.template字段如何定义 三、Statefulset使用案例&#xff1a;部署web站点3.1、编写一个Statefulset资…

Java并发篇_Java内存模型

在并发编程中&#xff0c;我们通常会遇到以下三个问题&#xff1a;原子性问题&#xff0c;可见性问题&#xff0c;有序性问题。那么它们产生的原因和在Java中解决的办法又是什么呢&#xff1f; 一、内存模型的相关概念 ​ 计算机在执行程序时&#xff0c;每条指令都是在CPU中执…

Java并发篇_synchronized

synchronized是Java语言的关键字&#xff0c;当它用来修饰一个方法或者一个代码块的时候&#xff0c;能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中的用法。 一、为什么要使用synchronized 在并发编程中存在线程安全问题&#xff0c;主要原因有&…

Java并发篇_volatile

volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制&#xff1a;同步块&#xff08;或方法&#xff09;和 volatile 变量&#xff0c;相比于synchronized&#xff08;synchronized通常称为重量级锁&#xff09;&#xff0c;volatile更轻量级&#xff…

分布式文件系统:原理、问题与方法

本地文件系统如ext3&#xff0c;reiserfs等&#xff08;这里不讨论基于内存的文件系统&#xff09;&#xff0c;它们管理本地的磁盘存储资源、提供文件到存储位置的映射&#xff0c;并抽象出一套文件访问接口供用户使用。但随着互联网企业的高速发展&#xff0c;这些企业对数据…

JDK源码解析之java.util.Iterator和java.lang.Iterable

在Java中&#xff0c;我们可以对List集合进行如下几种方式的遍历&#xff1a;第一种就是普通的for循环&#xff0c;第二种为迭代器遍历&#xff0c;第三种是for each循环。后面两种方式涉及到Java中的iterator和iterable对象&#xff0c;接下来我们通过源码来看看这两个对象的区…

JDK源码解析之java.util.AbstractCollection

AbstractCollection类提供了collection的实现类应该具有的基本方法&#xff0c;具有一定的普适性&#xff0c;可以从大局上了解collection实现类的主要功能。 java.util.AbstractCollection这个类提供了对接口Collection骨骼级的实现。 一、源码解析 1、iterator():返回一个迭…

GC 垃圾回收

垃圾回收机制是由垃圾收集器Garbage Collection GC来实现的&#xff0c;GC是后台的守护进程。它的特别之处是它是一个低优先级进程&#xff0c;但是可以根据内存的使用情况动态的调整他的优先级。因此&#xff0c;它是在内存中低到一定限度时才会自动运行&#xff0c;从而实现对…

高性能MySQL(1)——MYSQL架构

MySQL最重要、最与众不同的特性是它的存储引擎架构&#xff0c;这种架构将查询处理与数据的存储/提取相分离&#xff0c;使得可以在使用时根据不同的需求来选择数据存储的方式。 一、Mysql逻辑架构 如果能在头脑中构建出一幅MySQL各组件之间如何协同工作的架构图&#xff0c;就…