Linux——Docker容器资源控制

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的一样,步骤自己揣摩

猜你喜欢

转载自blog.csdn.net/weixin_45191791/article/details/108285379