3.3、Docker八年老兵Linux CGroup实战

  1、什么是Linux CGroup?

    由于Docker构建在Linux的基础之上,因此从Linux底层来看,Docker是利用Linux Control Group(简称Linux CGroup)来实现对资源使用的控制。因此,要掌握 Docker 容器 的资源管理有必要先了解一下什么是Linux CGroup。

     LinuxCGroup主要提供了以下功能。

  • Resourcelimitation;限制资源的使用,例如,使用CPU及内存的上限。
  • Prioritization:应用的优先级控制,例如,控制任务的调度。
  • Accounting:应用的审计和统计,例如,实现应用的计费。
  • Control:实现对应用的控制,例如,应用的挂起、恢复和执行等。

    要使用 Linux CGroup,则需要先通过执行以下步骤确定 Linux 的内核是否启用了 Linux CGroup。

(1)确定操作系统的发行版本,如下所示

[root@centos7-5 ~]# uname -r
3.10.0-957.el7.x86_64

(2)根据操作系统的发行版本,可以确定是否启用了Linux CGroup。以下代码中的 CGROUP参数的值是“y”,表示已经启动 Linux CGroup。

[root@centos7-5 ~]# cat /boot/config-3.10.0-957.el7.x86_64 | grep CGROUP
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y

    下面通过3个示例来演示如何使用LinuxGroup实现对系统资源的控制

2、案例一:通过LinuxCGroup限制应用的CPU使用率

    在本示例中,利用C语言开发一段执行死循环的代码。由于是死循环,所以代码的 CPU 使用率将很高。然后通过使用Linux CGroup,将代码的CPU 使用率限制在一定范围内,如 20%。下面是具体的操作步骤。

(1)开发一段C语言程序代码产生一个死循环,并将代码保存为 hello.c。

[root@centos7-5 ~]# vim hello.c
//hello.c
int main(void)
{
 int i = 0;
 for(;;) i++;
 return 0 ;
}

(2)将程序代码进行编译。

[root@centos7-5 ~]# gcc -o hello hello.c

(3)执行程序代码,这时程序将产生死循环无法退出,如下所示。

[root@centos7-5 ~]# ./hello

(4)在一个新的命令行窗口中,执行“top”命令监控应用hello的CPU 使用率,可以 看到已经达到了99.3%,如下所示。

(5)进入“/sys/fs/cgroup/cpu/”目录下,创建一个新的子目录hello。该目录用于 设置CPU使用率的闻值,如下所示。

[root@centos7-5 ~]# cd /sys/fs/cgroup/cpu/
[root@centos7-5 cpu]# mkdir hello
[root@centos7-5 cpu]# cd hello/
[root@centos7-5 hello]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks

(6)查看文件cpu.cfsquota us的内容为“-1”,表示没有对其CPU使用率进行限制。

[root@centos7-5 hello]# cat cpu.cfs_quota_us 
-1

(7)执行以下语句将CPU使用率的阙值设置为20%。

[root@centos7-5 hello]# echo 20000 > cpu.cfs_quota_us 
[root@centos7-5 hello]# cat cpu.cfs_quota_us 
20000

(8)将应用hello的进程ID写入tasks 文件,我的进程ID是8209,第四步上面有显示

[root@centos7-5 hello]# echo 8209 > tasks

(9)再次观察“top”命令的输出信息,发现应用hello的CPU使用率降到了20%

(10)我们再打开一个终端,重新启动一个hello 应用,并按照上面的步骤将进程D 写入tasks 文件。这时观 察“top”命令的输出会发现,两个 hello 应用各自占用10%的CPU使用率

 

[root@centos7-5 hello]# echo 8411 >> tasks 

2、案例二:通过LinuxCGroup限制应用使用系统内存 

(1)进入“cd /sys/fs/cgroup/memory”目录下,创建子目录 hello。

[root@centos7-5 ~]# cd /sys/fs/cgroup/memory/
[root@centos7-5 memory]# mkdir hello
[root@centos7-5 memory]# cd hello/
[root@centos7-5 hello]# ls
cgroup.clone_children           memory.kmem.slabinfo                memory.memsw.failcnt             memory.soft_limit_in_bytes
cgroup.event_control            memory.kmem.tcp.failcnt             memory.memsw.limit_in_bytes      memory.stat
cgroup.procs                    memory.kmem.tcp.limit_in_bytes      memory.memsw.max_usage_in_bytes  memory.swappiness
memory.failcnt                  memory.kmem.tcp.max_usage_in_bytes  memory.memsw.usage_in_bytes      memory.usage_in_bytes
memory.force_empty              memory.kmem.tcp.usage_in_bytes      memory.move_charge_at_immigrate  memory.use_hierarchy
memory.kmem.failcnt             memory.kmem.usage_in_bytes          memory.numa_stat                 notify_on_release
memory.kmem.limit_in_bytes      memory.limit_in_bytes               memory.oom_control               tasks
memory.kmem.max_usage_in_bytes  memory.max_usage_in_bytes           memory.pressure_level

 (2)查看文件memory.limit_in_bytes的内容。这里设定的值是9223372036854771712,表示没有对内存进行任何限制。

[root@centos7-5 hello]# cat memory.limit_in_bytes 
9223372036854771712

(3)以下语句会将内存的闽值设置为 64KB。如果应用使用的内存超过了该值,则该应 用会被操作系统自动“杀掉”。

[root@centos7-5 hello]# echo 64k > memory.limit_in_bytes 
[root@centos7-5 hello]# cat memory.limit_in_bytes 
65536

(4)生效配置,将应用hello的进程ID 写入tasks 文件。这里我在桌面打开了一个火狐浏览器(博主的Linux主机安装的是带桌面版的),可以看到进程ID为9532

 

[root@centos7-5 hello]# echo 9532 > tasks 

(5)然后再使用“Top”命令可以看到firefox进程已经没有了,说明内存使用超过了设定值,被系统“杀掉”了

3、案例三:通过Linux CGroup 限制应用使用I/O带 

    为了更好地观察结果,首先安装iotop工具,如图下所示

[root@centos7-5 ~]# yum -y install iotop

     以下演示如何使用LinuxCGroup 限制应用使用I/O带宽

(1)使用Linux的“dd”命令从磁盘持续读写数据。此时会占用终端。

[root@centos7-5 ~]# dd if=/dev/sda of=/dev/null

(2)新打开一个终端,通过iotop工具查看l/O读取的速度为915.66M/s

[root@centos7-5 ~]# iotop

(3)查看设备“/dev/sda”的信息。从中可以看到,设备“/dev/sda”的设 备号是“disk8,0” 

[root@centos7-5 ~]# ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 11月 24 09:19 /dev/sda

(4)使用LinuxCGroup 限制I/O对设备“/dev/sda”的读取速率。

[root@centos7-5 ~]# cd /sys/fs/cgroup/blkio/
[root@centos7-5 blkio]# mkdir io
[root@centos7-5 blkio]# cd io/
[root@centos7-5 io]# ls
blkio.io_merged                   blkio.io_service_time            blkio.sectors_recursive           blkio.time_recursive
blkio.io_merged_recursive         blkio.io_service_time_recursive  blkio.throttle.io_service_bytes   blkio.weight
blkio.io_queued                   blkio.io_wait_time               blkio.throttle.io_serviced        blkio.weight_device
blkio.io_queued_recursive         blkio.io_wait_time_recursive     blkio.throttle.read_bps_device    cgroup.clone_children
blkio.io_service_bytes            blkio.leaf_weight                blkio.throttle.read_iops_device   cgroup.event_control
blkio.io_service_bytes_recursive  blkio.leaf_weight_device         blkio.throttle.write_bps_device   cgroup.procs
blkio.io_serviced                 blkio.reset_stats                blkio.throttle.write_iops_device  notify_on_release
blkio.io_serviced_recursive       blkio.sectors                    blkio.time                        tasks

(5)将“/dev/sda”的读取速率限制为1MB/s之内

[root@centos7-5 io]# echo '8:0 1048576' > blkio.throttle.read_bps_device 

(6)将“dd”命令的进程ID(21681)写入tasks 文件

[root@centos7-5 io]# echo 10484 > tasks 

(7)再次观察iotop工具的监控输出信息会发现,这时“dd”命令对该设备的读取速 率已经被设置为1.00MB/s了

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值