Docker资源限制

一、基础知识

blkio: 这个subsystem可以为块设备设定输入/输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB等)。
cpu: 这个subsystem使用调度程序控制task对CPU的使用。
cpuacct: 这个subsystem自动生成cgroup中task对CPU资源使用情况的报告。
cpuset: 这个subsystem可以为cgroup中的task分配独立的CPU(此处针对多处理器系统)和内存。
devices 这个subsystem可以开启或关闭cgroup中task对设备的访问。
freezer 这个subsystem可以挂起或恢复cgroup中的task。
memory 这个subsystem可以设定cgroup中task对内存使用量的限定,并且自动生成这些task对内存资源使用情况的报告。
perfevent 这个subsystem使用后使得cgroup中的task可以进行统一的性能测试。{![perf: Linux CPU性能探测器,详见https://perf.wiki.kernel.org/index.php/MainPage]}
*net_cls 这个subsystem Docker没有直接使用,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量.

二、Docker资源限制

环境部署:

Redhat6.5版本
内存=1024M
CPU个数=2

具体部署:

  • unlimit -m 对最大内存不进行限制
    在这里插入图片描述
  • ulimit – a 显示当前所有的 limit 信息
    Docker资源限制_第1张图片

一、无限占用内存

[root@server1 ~]# useradd zh   ##新建用户zh
[root@server1 ~]# su - zh
[zh@server1 ~]$ ulimit -m
unlimited
[zh@server1 ~]$ :(){ :|:& };:   ##shell内存炸弹,无限制开启shell
  • 无限制开启shell
    Docker资源限制_第2张图片

二、设定 内存+交换分区 < = 200M

1、安装cgroup服务
[root@server1 ~]# yum search cgroup
[root@server1 ~]# yum install -y libcgroup.x86_64
[root@server1 ~]# /etc/init.d/cgconfig start
[root@server1 ~]# cd /cgroup/memory/
[root@server1 memory]# cat memory.limit_in_bytes   ##查看配置文件可知,内存未做限制
9223372036854775807
  • 内存限制文件
    Docker资源限制_第3张图片
2、设定资源限制参数:内存+交换分区<=200M
[root@server1 ~]# vim /etc/cgconfig.conf 
 28 group x1 {
 29         memory {
 30                 memory.limit_in_bytes = 209715200;
 31                 memory.memsw.limit_in_bytes = 209715200; ##完全限制内存
 32                 }
 33 }
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 ~]# cd /cgroup/memory/x1/
[root@server1 x1]# ls
cgroup.event_control       memory.memsw.limit_in_bytes      memory.swappiness
cgroup.procs               memory.memsw.max_usage_in_bytes  memory.usage_in_bytes
memory.failcnt             memory.memsw.usage_in_bytes      memory.use_hierarchy
memory.force_empty         memory.move_charge_at_immigrate  notify_on_release
memory.limit_in_bytes      memory.oom_control               tasks
memory.max_usage_in_bytes  memory.soft_limit_in_bytes
memory.memsw.failcnt       memory.stat
[root@server1 x1]# cat memory.limit_in_bytes 
209715200
[root@server1 x1]# cat memory.memsw.limit_in_bytes 
209715200
  • Mem used : 419
    在这里插入图片描述
3、测试
[root@server1 ~]# cd /dev/shm/
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.073585 s, 1.4 GB/s
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=200
Killed
  • Mem used : 619 = 419 +200
    在这里插入图片描述
    Docker资源限制_第4张图片

三、针对用户的内存资源限制

[root@server1 ~]# vim /etc/cgrules.conf 
 11 zh              memory          x1/
[root@server1 ~]# /etc/init.d/cgred start
[root@server1 ~]# cd /dev/shm/
[root@server1 shm]# ls
file
[root@server1 shm]# rm -fr file      ##删除200M的file文件
测试:
[root@server1 shm]# su - zh
[zh@server1 ~]$ cd /dev/shm/
[zh@server1 shm]$ dd if=/dev/zero of=file bs=1M count=300
Killed
[zh@server1 shm]$ logout

在这里插入图片描述

四、针对cpu的限制

对cpu.shares写入整数值可以控制该cgroup获得的时间片
[root@server1 ~]# vim /etc/cgconfig.conf 
 34 group x2 {         
 35          cpu {   
 36                  cpu.shares = 100;
 37              }
 38 }
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 ~]# cd /cgroup/cpu/x2/          ##查看cpu的限制
[root@server1 x2]# cat cpu.shares 
100
测试:
[root@server1 ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 6299
[root@server1 ~]# dd if=/dev/zero of=/dev/null &
[2] 6394
  • top 键 查看cpu接近100%
    Docker资源限制_第5张图片
  • top键 再按 1 出现两个cpu(只有cpu1可改,cpu0不可改)
    Docker资源限制_第6张图片
  • 更改cpu1
[root@server1 ~]# cd /sys/devices/system/cpu/cpu1
[root@server1 cpu1]# cat online    ##cpu1在线
1
[root@server1 cpu1]# echo 0 > online    ##使cpu1下线
[root@server1 cpu1]# top

示图:cpu1下线,只有cpu0在线,两个进程的cpu之和为100%
Docker资源限制_第7张图片

五、针对io的限制

[root@server1 ~]# cat /cgroup/blkio/blkio.throttle.read_bps_device     ##无io限制
[root@server1 ~]# vim /etc/cgconfig.conf 
 39 group x3 {
 40          blkio {
 41                  blkio.throttle.read_bps_device ="252:0 1000000";    #设定io输入、输出速率为1M
 42              }
 43 }
 [root@server1 ~]# /etc/init.d/cgconfig restart
测试:
[root@server1 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[1] 10424
[root@server1 ~]# yum install -y iotop
[root@server1 ~]# iotop 
  • io输入、输出基本稳定1M左右
    在这里插入图片描述

六、进程冻结(进程中止,但依旧存在)

[root@server1 ~]# cat /cgroup/freezer/x4/tasks    ##无进程任务
[root@server1 ~]# vim /etc/cgconfig.conf 
group x4 {
        freezer {}
}
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[1] 2313
[root@server1 ~]# cd /cgroup/freezer/x4/
[root@server1 x4]# echo 2313 > tasks
[root@server1 x4]# cat freezer.state 
THAWED                        ##进程解冻
测试:
  • 进程冻结
[root@server1 x4]# echo FROZEN > freezer.state          

示图: ps命令查看进程,进程存在
Docker资源限制_第8张图片
示图: iotop查看进程,进程不存在,进程冻结
在这里插入图片描述

  • 进程解冻
[root@server1 x4]# echo THAWED > freezer.state

示图: ps命令查看进程,进程存在
Docker资源限制_第9张图片
示图: iotop查看进程,进程存在,进程解冻
在这里插入图片描述

七、CPU绑定

所谓的cpu绑定,其实将当前进程或线程绑定到固定的CPU核心或者线程绑定到固定的CPU核心来提高系统调度程序的效率来提高程序执行的效率。
[root@server1 ~]# vim /etc/cgconfig.conf 
group x5 {
        cpuset {
                cpuset.cpus = 1;          ##2号cpu
                cpuset.mems = 0;          ##内存片
        }
}
[root@server1 ~]# /etc/init.d/cgconfig restart
测试:
当执行x5时,占用cpu1;
[root@server1 ~]# cgexec -g cpuset:x5 dd if=/dev/vda of=/dev/null &
[1] 2285
[root@server1 ~]# top
  • 资源优先运行在cpu1上
    在这里插入图片描述
正常执行dd命令,占用Cpu0(Maybe:Cpu1)
[root@server1 ~]# dd if=/dev/zero of=/dev/null &
[1] 2708

你可能感兴趣的:(Linux)