学习笔记——容器底层实现技术(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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容