限制容器资源

[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上

Q.E.D.