介绍容器实现的核心技术Namespace和Cgroup,学习容器技术的本质,
并对容器使用的资源进行限制
描述namespace实现
描述cgroup实现
掌握容器资源限制方法
一、Namespace和Cgroup
1.Docker容器实现原理
- Docker容器在实现上通过namespace技术实现进程隔离
- 通过cgroup技术实现容器进程可用资源的限制
-
docker启动一个容器时,实际是创建了带多个namespace参数的进程
2.Namespace
Namespace:命名空间
作用:资源隔离
原理:namespace将内核的全局资源进行封装,使得每个namespace都有一份独立的资源。因此不同进程在各自namespace内对同一种资源的使用不会相互干扰。
- 容器间的进程相互隔离,比如多个httpd容器都可以使用80端口。
- 容器与宿主主机间的进程也是隔离的
-
Namespace有很多种类型负责不同资源的隔离,包括进程、文件、网络、用户、主机名、信号量(kill进程这个动作也是隔离的,容器1kill不会影响容器2)
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限制设置在系统层面的体现
注:通过内核技术对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