修改linux资源限制参数命令,Linux下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对内存资源使用情况的报告。

perf_event: 这个subsystem使用后使得cgroup中的task可以进行统一的性能测试。

net_cls: 这个subsystem Docker没有直接使用,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量。

二、实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机

ip

server1(安装好docker)

172.25.83.1

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

1、针对系统

<1>安装cgroup服务,以提供cgexec命令

[root@server1 ~]# yum install libcgroup-tools.x86_64 -y

[root@server1 ~]# cd /sys/fs/cgroup/memory/

[root@server1 memory]# cat memory.limit_in_bytes #由文件内容,可以知道,内存未做限制。

9223372036854771712

[root@server1 memory]# cat memory.memsw.limit_in_bytes

9223372036854771712

<2>设定资源限制参数:内存+交换分区<=200M

[root@server1 ~]# cd /sys/fs/cgroup/memory/

[root@server1 memory]# mkdir xin/ #创建目录xin,该目录的名字随意给。在/sys/fs/cgroup/memory目录中创建的目录,自动继承/sys/fs/cgroup/memory目录中的内容。

#创建该目录的目的是(1)为了演示容器的运行过程。因为一旦运行容器,就会在该目录下,生成一个docker目录,docker目录中会生成容器ID对应的目录,目录中memory目录下的内容继承于/sys/fs/cgroup/memeory目录下的内容。(2)直接修改/sys/fs/cgroup/memory中的文件的内容,会报错。

[root@server1 xin]# echo 209715200 > memory.limit_in_bytes #设定最大占用内存为200M(209715200=200*1024*1024。209715200的单位为BB)

[root@server1 xin]# echo 209715200 > memory.memsw.limit_in_bytes #因为最大占用内存数和最大占用swap分区的内存数一样。表明最大可用内存为200M,可用swap为0M。即限制了内存+交换分区<=200M

[root@server1 xin]# cat memory.limit_in_bytes

209715200

[root@server1 xin]# cat memory.memsw.limit_in_bytes

209715200

值的注意的是:/sys/fs/cgroup/memory目录中的文件,不能用vim进行编辑,利用vim进行编辑,无法进行保存退出(即使使用"wq!",也不能保存退出。)

Mem  free:711

b1cf51730c0e64aa9c6a171c11f7fe67.png

<3>测试

[root@server1 ~]# cd /dev/shm/ #值的注意的是:必须在该目录下进行操作。

[root@server1 shm]# cgexec -g memory:xin dd if=/dev/zero of=bigfile bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.0431297 s, 2.4 GB/s

[root@server1 shm]# cgexec -g memory:xin dd if=/dev/zero of=bigfile bs=1M count=200

Killed #因为指定的文件的大小为300M超过了限制,所以显示Killed

Mem  free:711-200=511

1232fb57a2c1d30b7ce9152e856ead7b.png

补充内容:

如果不对内存和swap分区进行限制,即不修改/sys/fs/cgroup/memory/memory.limit_in_bytes和/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes文件中的内容。那么不管要生成的bigfile文件的大小为多少,dd命令永远会成功。

079fd919b2de79f19c0f0b1b5776364a.png

如果只是对内存进行限制(限制为200M),而没有对交换f分区进行限制,即只修改/sys/fs/cgroup/memory/memory.limit_in_bytes文件中的内容,而并没有修改/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes文件中的内容。那么如果要生成的bigfile文件的大小大于200M,dd命令会成功,但是只有200M是取自内存,剩余的取自交换分区。

2ed15599fbbbc45899af4ffcf3e3cd8d.png

2、针对docker容器

<1>指定内存和交换分区的大小,运行容器

[root@server1 ~]# docker run -it --name vm1 --memory 209715200 --memory-swap 209715200 ubuntu #利用ubuntu镜像运行容器vm1,指定内存+交换分区<200M。并使用Ctrl+p+q退出,即不要让容器停掉。

<2>测试

[root@server1 ~]# cd /sys/fs/cgroup/memory/docker/318b4c3783d67e9d791e25f965bc011b725fec76b985e20caf4e85699b7de874/ #其中318b4c3783d67e9d791e25f965bc011b725fec76b985e20caf4e85699b7de874就是容器vm1的容器ID号

[root@server1 318b4c3783d67e9d791e25f965bc011b725fec76b985e20caf4e85699b7de874]# cat memory.limit_in_bytes

209715200

[root@server1 318b4c3783d67e9d791e25f965bc011b725fec76b985e20caf4e85699b7de874]# cat memory.memsw.limit_in_bytes

209715200

[root@server1 318b4c3783d67e9d791e25f965bc011b725fec76b985e20caf4e85699b7de874]# cat tasks #看到的任务号,正是容器vm1对应的Pid

2959

#我们可以看到容器vm1对应的目录中文件memory.limit_in_bytes和memory.memsw.limit_in_bytes中的内容正是运行容器时指定的内容。表示配置成功

查看容器vm1的容器ID号

79c0afcfafd89152e73d88eb9e38b05d.png

查看容器vm1的Pid号

20eb80f464eeb7885f6249710b0ffa85.png

值的一提的是:因为容器的隔离性并不是很好,所以在容器内使用命令"free -m"看到的内容与宿主机上使用命令"free -m"看到的内容相同。所以如果要看是否限制成功,需要进入容器对应的目录中进行查看。

补充内容:

--memory可以单独使用,但是--memory-swap是必须要与--memory一起使用的

正常情况下,--memory-swap的值包含容器可用内存和可用swap,所以--memory="300m" --memory-swap="1g"的含义为:容器可以使用300M的物理内存,并且可以使用700M(1G-300M)的swap。--memory-swap 是容器可以使用的物理内存和可以使用的swap之和!

把--memory-swap设置为0和不设置是一样的,此时如果设置了--memory,则容器可以使用两倍--memory容量的swap。--memory="300m",--memory-swap没有设置,相当于可以使用300m内存+600m的swap

如果--memory-swap的值和--memory相同,则容器不能使用swap。

如果--memory-swap设置为-1,相当于不限制swap的容量,但是会受host主机的swap容量

在容器内部,free看到的swap是host的swap,并不是容器可用的swap容量。

--oom-kill-disable 当OOM(Out Of Memory)发生的时候,内核会kill掉容器内的进程,为了改变这种行为,可以在设置--memory的时候,同时设置--oom-kill-disable。如果没有设置--oom-kill-disable,则host可能会OOM,这时候内核会kill host的系统进程来释放memory。

四、针对cpu的限制

1、针对系统

<1>对cpu.cfs_quota_us写入整数值可以控制占用的cpu的大小

[root@server1 ~]# cd /sys/fs/cgroup/cpu

[root@server1 cpu]# mkdir xin

[root@server1 cpu]# cd xin/

[root@server1 xin]# echo 20000 > cpu.cfs_quota_us #占用"20000/100000=20%"的CPU

[root@server1 xin]# cat cpu.cfs_quota_us

20000

值的注意的是:/sys/fs/cgroup/cpu目录中的文件,不能用vim进行编辑,利用vim进行编辑,无法进行保存退出(即使使用"wq!",也不能保存退出。)

<2>测试

[root@server1 ~]# dd if=/dev/zero of=/dev/null &

[1] 3103

[root@server1 ~]# top #看到dd命令占用的cpu比例将近为100%,这是因为还没有在tasks文件中写入要限制的进程号

3103 root 20 0 107940 604 516 R 99.3 0.1 0:13.69 dd

[root@server1 ~]# cd /sys/fs/cgroup/cpu/xin/

[root@server1 xin]# cat tasks

[root@server1 xin]# echo 3103 > tasks #写入dd命令的进程号,对该进程进行限制

[root@server1 xin]# cat tasks

3103

[root@server1 xin]# top #看到dd命令占用的cpu比例在20%左右。

3103 root 20 0 107940 604 516 R 20.0 0.1 1:12.70 dd

[root@server1 xin]# kill -9 3103 #当dd命令对应的进程杀掉之后,tasks文件中的进程号,也会随之消失

[root@server1 xin]# cat tasks

补充内容:

如果不对cpu进行限制,即不修改/sys/fs/cgroup/cpu/cpu.cfs_quota_us(文件内容默认是-1,表示不限制)文件中的内容。那么执行命令"dd if=/dev/zero of=/dev/null &"时,会占用100%的cpu。

9d4a9a61a37ab86f70e6cceaa37fcd29.png

73d19ad487578035f4ae2726c03e099d.png

cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。

cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为50000,表示占用50000/100000=50%的CPU。

2、针对docker容器

<1>指定占用的cpu的大小,运行容器

[root@server1 xin]# docker run -it --name vm2 --cpu-quota 20000 #利用ubuntu镜像运行容器vm2,指定占用的cpu的大小,并使用Ctrl+p+q退出,即不要让容器停掉。

ubunturoot@a3d9e0263134:/# dd if=/dev/zero of=/dev/null & #执行dd命令

[1] 15

<2>测试

[root@server1 xin]# top

3225 root 20 0 4368 356 280 R 19.9 0.0 0:19.33 dd

[root@server1 ~]# cd /sys/fs/cgroup/cpu/

[root@server1 cpu]# cd docker/a3d9e0263134b42fd140485bd612eb2f8738b93f7bff0064d57f2d5019d938ff/

[root@server1 a3d9e0263134b42fd140485bd612eb2f8738b93f7bff0064d57f2d5019d938ff]# cat cpu.cfs_quota_us

20000

[root@server1 a3d9e0263134b42fd140485bd612eb2f8738b93f7bff0064d57f2d5019d938ff]# cat tasks

3182

#我们可以看到容器vm1内运行的dd命令,占用的cpu在20%左右,并且,进入容器对应的目录下看到cpu.cfs_quota_us的大小为20000,tasks中的进程号为3182,对应的是vm2容器的Pid号,表示配置成功。

查看容器vm2的容器ID号

0a2676a458f761406d06d7ba3be6b2f4.png

查看容器vm2的Pid号

c3f8278207bcdad880dfa222c840b8c2.png

补充内容:

如果在运行容器时,不对cpu进行限制,那么在容器内执行命令"dd  if=/dev/zero of=/dev/null",cpu的占有率会接近100%

7707fd17954ed489c93415d9e3ef572c.png

84fa7521fa4f0866441fa75cccfdbc77.png

五、针对写速率的限制

针对docker容器

<1>赋予全部的权限运行容器(因为直接运行容器的话,是以普通用户的身份进行登录的,会没有权限),查看容器内的磁盘名称

[root@server1 ~]# docker run -it --rm --privileged=true ubuntu

root@f885c1e54400:/# fdisk -l

Disk /dev/vda: 21.5 GB, 21474836480 bytes #容器内的磁盘名称为/dev/vda

16 heads, 63 sectors/track, 41610 cylinders, total 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x0000fc33

Device Boot Start End Blocks Id System

/dev/vda1 * 2048 2099199 1048576 83 Linux

/dev/vda2 2099200 41943039 19921920 8e Linux LVM

<2>限制写入的速率,运行容器,并进行测试

[root@server1 ~]# docker run -it --rm --device-write-bps /dev/vda:30MB ubuntu #以写入速率为30M/s的限制运行容器

root@36af993c0224:/# dd if=/dev/zero of=file bs=1M count=300 oflag=direct # 截取300M的名为file的文件。其中参数oflag=direct表示跳过内存缓存,直接存在磁盘中。必须加该参数,否则测试会失败。

300+0 records in

300+0 records out

314572800 bytes (315 MB) copied, 10.0878 s, 31.2 MB/s #看到速率为31.2 MB/s,表示配置成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值