限制容器资源
[root@cka-node1 ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 525M 275M 9M 1.0G 1.0G
[root@cka-node1 ~]# docker run -d --name nginx nginx
[root@cka-node1 ~]# ps aux | grep nginx | grep -v grep
root 86037 0.0 0.1 10640 3336 ? Ss 19:04 0:00 nginx: master process nginx -g daemon off;
101 86093 0.0 0.0 11044 1516 ? S 19:04 0:00 nginx: worker process
101 86094 0.0 0.0 11044 1516 ? S 19:04 0:00 nginx: worker process
#通过docker stats 可以看到nginx容器使用的内存和宿主机一样
[root@cka-node1 ~]# docker stats nginx
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a0ecf84a5b1b nginx 0.00% 1.984MiB / 1.779GiB 0.11% 648B / 0B 0B / 18.4kB 3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a0ecf84a5b1b nginx 0.00% 1.984MiB / 1.779GiB 0.11% 648B / 0B 0B / 18.4kB 3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a0ecf84a5b1b nginx 0.00% 1.984MiB / 1.779GiB 0.11% 648B / 0B 0B / 18.4kB 3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a0ecf84a5b1b nginx 0.00% 1.984MiB / 1.779GiB 0.11% 648B / 0B 0B / 18.4kB 3
利用Cgroup限制
#可以利用Cgroup限制--> 是linux的一个特性
概念
Linux Cgroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。所以,可以将 controll groups 理解为 controller (system resource) (for) (process)groups,也就是是说它以一组进程为目标进行系统资源分配和控制。
它主要提供了如下功能:
- Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
- Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
- Accounting: 一些审计或一些统计,主要目的是为了计费。
- Control: 挂起进程,恢复执行进程。
使用 cgroup,系统管理员可更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体效率。
在实践中,系统管理员一般会利用CGroup做下面这些事(有点像为某个虚拟机分配资源似的):
- 隔离一个进程集合(比如:nginx的所有进程),并限制他们所消费的资源,比如绑定CPU的核。
- 为这组进程分配其足够使用的内存
- 为这组进程分配相应的网络带宽和磁盘存储限制
- 限制访问某些设备(通过设置设备的白名单)
测试
[root@cka-node1 ~]# mkdir /xx
[root@cka-node1 ~]# mv memload-7.0-1.r29766.x86_64.rpm /xx
#此时内存先不限制
[root@cka-node1 ~]# docker run -it --name test --rm -v /xx:/xx centos
[root@ca81d30a7fa9 /]# cd xx
[root@ca81d30a7fa9 xx]# rpm -i memload-7.0-1.r29766.x86_64.rpm
[root@cka-node1 ~]# docker stats test
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ca81d30a7fa9 test 0.00% 6.395MiB / 1.779GiB 0.35% 648B / 0B 8.19kB / 39.2MB 1
[root@ca81d30a7fa9 xx]# memload 500
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ca81d30a7fa9 test 100.74% 502.4MiB / 1.779GiB 27.58% 648B / 0B 7.37MB / 39.2MB 2
限制内存
[root@cka-node1 ~]# docker run -it --rm -m 512m --name test -v /xx:/xx centos
[root@daccb14e3545 /]# cd xx
[root@daccb14e3545 xx]# rpm -i memload-7.0-1.r29766.x86_64.rpm
[root@daccb14e3545 xx]# memload 500
#此时容器就内存被限制在了512
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8b0bc83a9568 test 0.00% 524KiB / 512MiB 0.10% 578B / 0B 1.4MB / 0B 1
CPU亲和性
docker run -it --rm --cpuset-cpus=0 nginx #放了0号cpu上运行
docker run -it --rm --cpuset-cpus=0,1 nginx #0和1上
docker run -it --rm --cpuset-cpus=0-2 nginx #0到2上