目录
前言
在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。
一、CPU 资源控制
1、cgroup 介绍
Cgroup 是 Control group 的简称,是 Linux 内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用。对不同资源的具体管理是由各个子系统分工完成的。
2、cgroup 的功能
限制资源使用,比如内存使用上限以及文件系统的缓存限制。
优先级控制,CPU利用和磁盘IO吞吐。
资源统计,主要目的是为了计费。
任务控制,挂起进程,恢复执行进程。
3、Cgroup子系统
blkio | 设置限制每个块设备的输入输出控制,例如:磁盘、光盘、usb等等 |
CPU | 使用调度程序为cgroup任务提供CPU的访问 |
cpuacct | 产生cgroup任务的CPU资源报告 |
cpuset | 如果是多核心的CPU,这个子系统会为cgroup任务分配单独的CPU和内存 |
devices | 允许或拒绝cgroup任务对设备的访问 |
freezer | 暂停和恢复cgroup任务 |
memory | 设置每个cgroup的内存限制以及产生内存资源报告 |
net_cls | 标记每个网络包以供cgroup方便使用 |
ns | 命名空间子系统 |
perf_event | 增加了对每个group的检测跟踪能力,可以检测属于某个特定的group的所有线程以及运行在特定CPU上的线程 |
4、CPU使用率控制
[root@localhost docker]# cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_quota_us
-1
#-1:代表此容器可以使用得资源不受限制
- 查看
[root@localhost ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
01e51947aa64 t10 0.00% 82.71MiB / 3.683GiB 2.19% 13.5MB / 272kB 0B / 49.1MB 1
5、限制cpu时间周期
5.1 方式1
假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s
[root@localhost ~]# docker run -itd --name=t1 --cpu-quota 20000 centos:7 /bin/bash
8167c75eef1a67baaef63e0b8575b9aac91be5ab79edbb51abe7028388f923f2
压力测试
[root@localhost ~]# docker exec -it 8167c75eef1a /bin/bash
[root@8167c75eef1a /]# yum -y install bc
#计算圆周率
[root@8167c75eef1a /]# echo "scale=5000;4*a(1)"| bc -l -q
[root@localhost ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8167c75eef1a t1 20.00% 74.42MiB / 3.683GiB 1.97% 13.1MB / 223kB 0B / 47.6MB 3
01e51947aa64 t10 0.00% 82.71MiB / 3.683GiB 2.19% 13.5MB / 272kB 0B / 49.1MB 1
5.2 方式2
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/
[root@localhost docker]# echo "20000" > 01e51947aa6402395f05a2573efa48191e3d8b85a67caf1ed58746a44e68d347/cpu.cfs_quota_us
6、设置容器的权重
按比例分配设置容器的权重,此处权重是所有值相加然后看占用百分比
[root@localhost docker]# docker run -itd --name=c1 --cpu-shares 512 centos:7 /bin/bash
4421cdb3f44c091ac88a6538725141a627cf0645b5a8917fab1e2425786fc777
[root@localhost docker]# docker run -itd --name