Docker资源控制
1.Namespace(名称空间)
Linux内核提供了6中Namespce隔离的系统调用工具。
Linux内核实现namespace的主要目的,通俗易懂点的话就是为了实现轻量级虚拟化技术服务。在同一个namespace下的进程合一感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛自己置身一个独立的系统环境中,以达到容器与宿主机、容器与容器之间的隔离。
[root@docker ns]# pwd
/proc/17/ns
[root@docker ns]# ll
总用量 0
lrwxrwxrwx 1 root root 0 8月 26 13:54 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 8月 26 13:54 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 8月 26 13:54 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 8月 26 13:54 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 8月 26 13:54 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 8月 26 13:54 uts -> uts:[4026531838]
Namespce | 系统调用参数 | 解释 |
IPC | CLONE_NEWIPC | 共享内存、信号量、和消息队列 |
MNT | CLONE_NEWNS | 挂载点、文件系统 |
NET | CLONE_NEWNET | 网络设备、网络栈、端口 |
PID | CLONE_NEWPID | 进程编号 |
USER | CLONE_NEWUSER | 用户、组 |
UTS | CLONE_NEWUTS | 主机名、域名 |
2.Cgroup(控制组)
Docker通过Cgroup来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
Cgroup的四大功能
功能 | 解释 |
资源限制 | cgroup可以对进程组使用的资源总额进行限制 |
优先级分配 | 通过分配的cpu时间片数量以及硬盘IO带宽大小,实际上相当于控制了进程运行的优先级别 |
资源统计 | cgroup可以统计系统资源使用量,比如cpu使用时间, 内存使用量等,用于按量计费。同时,还支持挂起功能,也就是说通过cgroup把所有资源限制起来,对资源都不能使用,从而实现限制的作用。 |
进程控制 | 可以对进程组执行挂起、恢复等操作 |
[root@docker ~]# cd /sys/fs/cgroup/
[root@docker cgroup]# cat tasks
PS:tasks这个文件内的数字,记录的是进程编号(PID)
【1】内存限额(Swap)
容器可使用的内存有两部分:物理内存和swap
Docker通过下面两组参数来控制容器内存的使用量
-m 或 --memory:设置内存的使用限额
–memory-swap:设置内存+swap(虚拟内存)的使用限额
语法:
[root@docker ~]# docker run -itd --name test1 -m 100MB --memory-swap 200MB centos:7
9e111ce3fab70649e543abfae484ad421955e61c0999fff1061fa07261ba5b42
PS:这条命令的意思是运行一个test1的容器,设置内存的限额是100MB,swap的限额是100MB
–memory-swap 200MB 的意思是 物理内存的限额大小加上swap的限额大小
【2】CPU权重
Docker通过-c或者–cpu-shares来设置容器的CPU权重
语法:
[root@docker ~]# docker run -itd --name test2 -c 512 centos:7
78bcc848e492493b2ebbcfd5425acf08375e724e3c8efa4f640cf9b12c80dda0
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/78bcc848e492493b2ebbcfd5425acf08375e724e3c8efa4f640cf9b12c80dda0/cpu.shares
512
如果不设置CPU权重的话则为默认:1024
[root@docker ~]# docker run -itd --name test3 centos:7
33a6f595bfe5e13ec7984924116a01d695ff1babfc945f27c2487d745b762f43
[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/33a6f595bfe5e13ec7984924116a01d695ff1babfc945f27c2487d745b762f43/cpu.shares
1024
【3】Block IO(磁盘读写)
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重来限制 bps 和 iops 的方式控制容器读写磁盘的带宽。
(1)Block IO权重
默认情况下,所有容器能平等地读写磁盘,可以通过设置**–blkio-weight参数来改变容器 Block IO 的优先级,–blkio-weight** 与 –cpu-shares 类似,设置的是相对权重值,默认为 500。
语法:
[root@docker ~]# docker run -itd --name test4 --blkio-weight 600 centos:7
56f7e1f61515e1ad25d411433b17f0a0c4d9dbed7542fc0b900c72718534c70c
[root@docker ~]# docker run -itd --name test5 --blkio-weight 300 centos:7
773323490ab3551c712d39b92067da8e89f28408c624c353a783e158bffd662e
这条命令的意思是:test4读写磁盘的带宽是test5的两倍
我们可以再/sys/fs/cgroup/blkio/docker下看到Block IO的数值
[root@docker ~]# cd /sys/fs/cgroup/blkio/docker/
[root@docker docker]# ls
33a6f595bfe5e13ec7984924116a01d695ff1babfc945f27c2487d745b762f43
56f7e1f61515e1ad25d411433b17f0a0c4d9dbed7542fc0b900c72718534c70c
773323490ab3551c712d39b92067da8e89f28408c624c353a783e158bffd662e
78bcc848e492493b2ebbcfd5425acf08375e724e3c8efa4f640cf9b12c80dda0
9e111ce3fab70649e543abfae484ad421955e61c0999fff1061fa07261ba5b42
b0367fa81428311db4f253a0e7c7c7867e5274cb5730e5b6d3bf6abe64918a57
......
(2)限制bps和iops
- bps是每秒读写的数据量
- iops是每秒IO的操作次数
可以通过以下参数来限制容器的bps和iops
参数 | 解释 |
–device-read-bps | 显示读取某个设备的bps |
–device-write-bps | 显示写入某个设备的bps |
–device-read-iops | 显示读取某个设备的iops |
–device-write-iops | 显示写入某个设备的iops |
语法:
PS:设置testA这个容器,每秒写入/dev/sda磁盘的bps为30MB,从/dev/zero输入,然后输出到test.out文件中,每次大小为1M,总共 800次,oflag=direct 用来指定directIO方式写文件,这样才会使–devicewrite-bps生效。
最后为26秒 也可以算法算一下 800/30=26 余数为20
[root@docker docker]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos:7
[root@cafef7d06315 /]# time dd if=/dev/zero of=test.txt bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 26.6187 s, 31.5 MB/s
real 0m26.621s
user 0m0.001s
sys 0m0.540s
在运行一个没有做限制的容器,对一下速率
[root@docker docker]# docker run -it --name testB centos:7
[root@21696c42c1e6 /]# time dd if=/dev/zero of=test.txt bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 2.95036 s, 284 MB/s
real 0m2.952s
user 0m0.000s
sys 0m0.781s
iops的语法跟bps的一样,步骤自己揣摩