学习笔记——容器底层实现技术(5)

介绍容器实现的核心技术Namespace和Cgroup,学习容器技术的本质,
并对容器使用的资源进行限制
 描述namespace实现
 描述cgroup实现
 掌握容器资源限制方法

一、Namespace和Cgroup

1.Docker容器实现原理

  • Docker容器在实现上通过namespace技术实现进程隔离
  • 通过cgroup技术实现容器进程可用资源的限制
  • docker启动一个容器时,实际是创建了带多个namespace参数的进程


    image.png

2.Namespace

Namespace:命名空间
 作用:资源隔离
 原理:namespace将内核的全局资源进行封装,使得每个namespace都有一份独立的资源。因此不同进程在各自namespace内对同一种资源的使用不会相互干扰。

  • 容器间的进程相互隔离,比如多个httpd容器都可以使用80端口。
  • 容器与宿主主机间的进程也是隔离的
  • Namespace有很多种类型负责不同资源的隔离,包括进程、文件、网络、用户、主机名、信号量(kill进程这个动作也是隔离的,容器1kill不会影响容器2)


    image.png

2.1.示例 (容器在宿主主机上的进程id表现-进程隔离)

[root@cent701 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
61b7c8ccc141        httpd               "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8081->80/tcp   httpd2
3ba7aa9fcb1e        httpd               "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8080->80/tcp   httpd1
[root@cent701 ~]# docker inspect 61 | grep pid -i
            "Pid": 44362,
            "PidMode": "",
            "PidsLimit": 0,
[root@cent701 ~]# ps -ef | grep 44362
root      44362  44348  0 10:04 ?        00:00:00 httpd -DFOREGROUND
33        44410  44362  0 10:04 ?        00:00:00 httpd -DFOREGROUND
33        44411  44362  0 10:04 ?        00:00:00 httpd -DFOREGROUND
33        44412  44362  0 10:04 ?        00:00:00 httpd -DFOREGROUND

3.Cgroup

◼Cgroups:Linux Control Group
 作用:限制一个进程组对系统资源的使用上限,包括CPU、内存、Block I/O等。
◼ Cgroups还能设置进程优先级,对进程进行挂起和恢复等操作。
 原理:将一组进程放在一个Cgroup中,通过给这个Cgroup分配指定的可用资源,达到控制这一组进程可用资源的目的。
 实现:在Linux中,Cgroups以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下。该路径中所有的资源种类均可被cgroup限制。(linux的思想一切皆文件,通过文件进行资源的限制)

3.1CPU资源限制

  • 可通过如下参数,对容器的可用CPU资源进行限制:
     --cpu-shares:权重值,表示该进程能使用的CPU资源的权重值。cpu占用的百分比。
     cpu.cfs_period_us和cpu.cfs_quota_us:这两个配置参数一般配合使用,表示限制进程在长度为cfs_period的一段时间内,只能被分配到总量为cfs_quota的CPU时间。即:在一定时间周期内所使用的的cpu总量
  • vmware也可对cpu的使用进行限制其称作份额。
  • cpu被称作可压缩资源:
    1)需要多少cpu资源都可以满足。
    2)分时间片交付

CPU资源限制示例

启动一个容器,进行压力测试,设置cpu权重值为512
stress 容器:用来做压力测试的容器
1)清空所有容器,环境准备

[root@cent701 cgroup]# docker ps 
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
61b7c8ccc141        httpd               "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8081->80/tcp   httpd2
3ba7aa9fcb1e        httpd               "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8080->80/tcp   httpd1
[root@cent701 cgroup]# docker rm `docker ps -aq` -f
61b7c8ccc141
3ba7aa9fcb1e
482fe03e89a5

2)安装stress容器

[root@cent701 cgroup]# docker search stress | more
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
progrium/stress                                                           39                                      [OK]
polinux/stress            Stress tool in a Docker (Alpine) Raspberry P…   31                                      [OK]

3)创建并启动huawei1 容器 使用stress镜像,设置cpu权重值为512

[root@cent701 cgroup]# docker run --name huawei1 -it --cpu-shares 512 progrium/stress --cpu 1
Unable to find image 'progrium/stress:latest' locally
latest: Pulling from progrium/stress
a3ed95caeb02: Pull complete 
871c32dbbb53: Pull complete 
dbe7819a64dd: Pull complete 
d14088925c6e: Pull complete 
58026d51efe4: Pull complete 
7d04a4fe1405: Pull complete 
1775fca35fb6: Pull complete 
5c319e267908: Pull complete 
Digest: sha256:e34d56d60f5caae79333cee395aae93b74791d50e3841986420d23c2ee4697bf
Status: Downloaded newer image for progrium/stress:latest
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [6] forked

说明:
1.cpu-shares 512 给与镜像cpu使用权重 为512
2.cpu 1 给与镜像cpu核数为1核
启动宿主机连接窗口,利用top命令查看stress的容器cpu使用率

top - 14:38:39 up  5:24,  4 users,  load average: 2.40, 1.40, 0.66
Tasks: 118 total,   2 running, 116 sleeping,   0 stopped,   0 zombie
%Cpu(s): 96.7 us,  3.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :   999692 total,   110736 free,   244736 used,   644220 buff/cache
KiB Swap:   511996 total,   511996 free,        0 used.   510676 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                
 14447 root      20   0    7304     96      0 R 95.0  0.0   4:06.01 stress

4)创建并启动huawei2 容器 使用stress镜像,设置cpu权重值为2048

[root@cent701 ~]# docker run --name huawei2 -it --cpu-shares 2048 progrium/stress --cpu 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [6] forked

5)top观察

top - 14:45:44 up  5:31,  6 users,  load average: 2.41, 2.05, 1.23
Tasks: 133 total,   4 running, 128 sleeping,   0 stopped,   1 zombie
%Cpu(s): 96.0 us,  4.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   999692 total,   100636 free,   244800 used,   654256 buff/cache
KiB Swap:   511996 total,   511996 free,        0 used.   507972 avail Mem 
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                
 30416 root      20   0    7304     96      0 R 74.1  0.0   1:05.83 stress                                                                                                 
 14447 root      20   0    7304     96      0 R 18.6  0.0   9:36.23 stress

说明 按照512:2048的权重,2:8分可以看到CPU使用率分别为74%:18%
6)观察cpu限制设置在系统层面的体现


image.png

注:通过内核技术对cpu资源进行的限制

3.2内存资源限制

默认情况下,宿主机不限制容器对内存资源的使用。可使用如下参数来控制容器对内存资源的使用:
 --memory:设置内存资源的使用限额
 --memory-swap:设置内存和SWAP资源的使用限额
对进程内存使用限制的详细配置参数在/sys/fs/cgroup/memory目录

内存资源限制示例已centos容器为例

1)整理环境删除所有counter

[root@cent701 ~]# docker rm `docker ps -qa` -f

容器的启动必须要有一个前台进程。如果没有前台进程容器无法启动,即使用了docker run的命令。下述命令的说明
-dit 后台运行交互终端
centos 使用centos镜像
/bin/bash 给他一个前台的进程,对应centos的后台运行理由见上。
docker run --name huawei1 --memory 400M --memory-swap 500M -dit centos /bin/bash

3.3Block IO限制

  • Block IO指的是磁盘的读写,可通过如下3种方式限制容器读写磁盘的带宽。  设置相对权重
    ◼ --blkio-weight Block IO (relative weight)
     设置bps:每秒读写的数据量
    ◼ --device-read-bps Limit read rate (bytes per second) from a device
    ◼ --device-write-bps Limit write rate (bytes per second) to a device
     设置iops:每秒IO次数
    ◼ --device-read-iops Limit read rate (IO per second) from a device
    ◼ --device-write-iops Limit write rate (IO per second) to a device
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容