Docker管理容器资源

管理容器的资源
        在一台Docker宿主机上可以同时启动多个容器。在默认情况下,Docker没有限制其中
运行的容器使用硬件资源。而在实际环境中,容器的负载过高会占用宿主机的大量资源。这
里的资源主要是指宿主机的CPU、内存和I/0带宽这三个方面。
本节将介绍如何使用 Docker 的资源管理给容器的资源使用设置一个闻值,以控制容器
对宿主机CPU、内存和I/O带宽的使用。 ​​​​​​​

什么是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@node1 ~]# uname -r    //查看系统版本
3.10.0-957.el7.x86_64

2)根据操作系统的发行版本,可以确定是否启动了Linux CGroup。CGROUP参数的值是

"y",表示已经启动Linux CGroup。

[root@node1 ~]# cat /boot/config-3.10.0-957.el7.x86_64 | grep CGROUP    

1.通过Linux CGroup限制应用的CPU使用率

        在本示例中,利用C语言开发一段执行死循环的代码。由于是死循环,所以代码的 CPU
使用率将很高。然后通过使用Linux CGroup,将代码的CPU 使用率限制在一定范围内,如
20%。下面是具体的操作步骤。
1)开发一段C语言程序代码产生一个死循环,并将保存玮 hrllo.c
[root@node1 ~]# vim hello.c
[root@node1 ~]# cat hello.c 
 //hello.c
 int main(void)
 {
  int i = 0;
  for(;;) i++;
  return 0;
 }

2)将程序代码进行编译

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

3)执行程序代码,这时程序将产生死循环无法退出

[root@node1 ~]# ./hello 

4)在一个新的命令行窗口中,使用"top" 命令监控应用 hello 的CPU 使用率

[root@node1 ~]# top    //动态查看消耗资源

5)进入 "/sys/fs/cgroup/cpu" 目录下,创建一个新的子目录hello 该目录用于设置CPU使用率的闻值
[root@node1 ~]# cd /sys/fs/cgroup/cpu        //切换目录
[root@node1 cpu]# mkdir hello        //创建hello文件夹
[root@node1 cpu]# cd hello/    //进入hello文件夹
[root@node1 hello]# pwd        //查看当前工作目录
/sys/fs/cgroup/cpu/hello    
[root@node1 hello]# ls        //列出所有当前目录文件
cgroup.clone_children  cpuacct.usage_percpu  cpu.shares
cgroup.event_control   cpu.cfs_period_us     cpu.stat
cgroup.procs           cpu.cfs_quota_us      notify_on_release
cpuacct.stat           cpu.rt_period_us      tasks
cpuacct.usage          cpu.rt_runtime_us

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

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

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

[root@node1 hello]# echo 20000 > cpu.cfs_quota_us 

8)将应用hello的进程ID写入tasks 文件

[root@node1 hello]# echo 92698 > tasks

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

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

[root@node1 hello]# echo 94297 > tasks 

2.通过Linux CGroup 限制应用使用系统内存

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

[root@node1 ~]# cd /sys/fs/cgroup/memory/        //切换工作目录
[root@node1 memory]# mkdir hello    //创建hello文件
[root@node1 memory]# cd hello/        //切换到创建文件中

2)查看文件memory.limit_in_bytes 的内容

[root@node1 hello]# cat memory.limit_in_bytes     //打开文件
9223372036854771712        //输出内容

3)以下语句会将内存的闽值设置为8KB(生产环境中可按照所需要的自定义) 如果应用使用的内存超过了该值,则应该会被操作系统自动 "kill"掉

[root@node1 hello]# echo 8k > memory.limit_in_bytes 

4)生效配置,将应用hello的进程ID写入tasks文件

[root@node1 hello]# echo 94297 > tasks 

3.通过Linux CGroup 限制应用使用 I/O带宽

为了更好的观察结果,首先安装iotop工具

[root@node1 ~]# yum -y install iotop

1)使用Linux的 ”dd“ 命令从磁盘持续读写数据

[root@node1 ~]# dd if=/dev/sda of=/dev/null

2)通过iotop工具查看I/O读取的速度

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

[root@node1 ~]# ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 11月 22 08:24 /dev/sda

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

[root@node1 ~]# mkdir /sys/fs/cgroup/blkio/io    //创建文件夹
[root@node1 ~]# cd /sys/fs/cgroup/blkio/io/        //进入创建文件夹
[root@node1 io]# echo '8:0 1048576' > blkio.throttle.read_bps_device    //限制1T重定向导入文件内
通过这样,I/O对该设备的读取速率被限制在1MB/s之内了
5)将 "dd" 命令的进程ID写入tasks 文件
[root@node1 io]# echo 107347 > tasks

6)再次观察iotop工具的监控输出信息会发现,这是 "dd" 命令对该设备的去速率已经被设置玮1.00MB/s
了解了 Linux CGroup后,再来讨论“Docker 是如何对容器使用的资源进行设定
的”就变得非常简单了。Docker只是对 Linux CGroup进行了封装,从而简化了调用操作的
方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值