第三章 docker容器

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

  • LinuxCGroup主要提供了以下功能:

  • 1.Resourcelimitation;限制资源的使用,例如,使用CPU及内存的上限\nPrioritization:应用的优先级控制,例如,控制任务的调度\nAccounting:应用的审计和统计,例如,实现应用的计费

  • 2.Control:实现对应用的控制,例如,应用的挂起、恢复和执行等\n要使用 Linux CGroup,则需要先通过执行以下步骤确定 Linux 的内核是否启用了 Linux CGroup\n\n(1)确定操作系统的发行版本

  • 确认操作系统的发行版本

  • [root@localhost ~]# uname -r
    3.10.0-957.el7.x86_64
    

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

  • [root@localhost ~]# 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实现对系统资源的控制

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

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

  • [root@localhost ~]# vim hello.c
    文件内的内容如下:
    //hello.c
    int main(void)
    {
     int i = 0;
     for(;;) i++;
     return 0;
    }
    

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

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

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

  • [root@localhost ~]# ./hello
    

    (4)使用另一个终端用top命令查看应用hello的cpu使用率可以看到已经达到了99%+

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

  • [root@localhost ~]# cd /sys/fs/cgroup/cpu
    [root@localhost cpu]# mkdir hello
    

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

  • [root@localhost cpu]# cat cpu.cfs_quota_us
    显示的内容
    -1
    

    (7)切换到hello目录,并设置CPU使用率的闻值为20%

  • [root@localhost cpu]# cd hello
    [root@localhost hello]# echo 20000 > cpu.cfs_quota_us 

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

  • echo 9640 > tasks

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

  • (10)重新启动一个hello应用并按照上面的步骤将进程D写入tasks文件这时观察“top”命令的输出会发现,两个hello应用各自占用10%的CPU使用率示例二通过linuxcgroup限制应用使用系统内存

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

  • [root@localhost ~]# cd /sys/fs/cgroup/memory/
    [root@localhost memory]# mkdir hello
    
    

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

  • [root@localhost memory]# cd hello/
    [root@localhost hello]# cat memory.limit_in_bytes 
    9223372036854771712
    

    (3)以下语句会将内存的阈值设置为64kb,如果应用使用的内存超过了该值,则会被自动杀死进程

  • [root@localhost hello]# echo 64k > memory.limit_in_bytes 
    

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

  • echo 10134 > tasks
    

    示例三通过linuxcgroup限制应用使用I/O带宽

  • 1、先安装iotop工具为了方便更好的观察

  • [root@localhost ~]# yum -y install iotop
    

    2.使用linux的”dd“命令从磁盘持续读写数据,最终结果为556MB/秒

  • [root@localhost ~]# dd if=/dev/sda of=/dev/null
    记录了41943040+0 的读入
    记录了41943040+0 的写出
    21474836480字节(21 GB)已复制,38.6551 秒,556 MB/秒
    

  • 3.通过iotop在另外一台终端上测试工具查看I/O读取速度为429.43M/s4.查看设备”/dev/sda“的信息,可以看到设备”/dev/sda“的设备号是”disk8,0“

  • [root@localhost ~]# ls -l /dev/sda
    brw-rw----. 1 root disk 8, 0 11月 24 09:30 /dev/sda
    

    5.使用LinuxCGROUP限制I/O对设备”/dev/sda“的读取速率

  • [root@localhost io]# echo '8:0 1048576' > blkio.throttle.read_bps_device 
    

    通过这样I/O该设备的读取速率就被限制在1MB/S之内了

  • 6.将”dd“命令的进程id(10420)写入tasks文件中

  • [root@localhost io]# echo 10420 > tasks
    
  • 7.如图所示这样就可以看到这时dd命令对该设备的读取速率已经被设置为1.00MB/s了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值