【云原生Docker系列第四篇】Docker Cgroups资源控制操作(人人都喜欢森林,却都不想去种树)(一)

简介: 【云原生Docker系列第四篇】Docker Cgroups资源控制操作(人人都喜欢森林,却都不想去种树)(一)

前言


cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权、计算使用量、操控进程启停等等。所以cgroups(Control groups)实现了对资源的配额和度量。


一、cgroups四大功能


资源限制:可以对任务使用的资源总额进行限制

优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级

资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等

任务控制:cgroup可以对任务执行挂起、恢复等操作


二、设置cpu使用率上线


Linux通过crs(Completely Fair scheduler,完全公平调度器)来调度各个进程对CPU的使用。crs默认的调度周期是100ms。

我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

使用–cpu-period 即可设置调度周期,使用–cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。

CFS周期的有效范围是1ms~1s,对应的–cpu-period 的数值范围是1000~1000000。

而容器的CPU配额必须不小于1ms,即–cpu-quota的值必须>=1000。

2.1示例:

#创建容器
[root@localhost ~]# docker run -itd --name c1 centos:7 /bin/bash
ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78
#查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED              STATUS              PORTS     NAMES
ff1dd348e227   centos:7   "/bin/bash"   About a minute ago   Up About a minute             c1
#查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
ff1dd348e227   centos:7   "/bin/bash"   3 minutes ago   Up 3 minutes             c1
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/
[root@localhost docker]# ls
cgroup.clone_children  cpuacct.stat          cpu.cfs_period_us  cpu.rt_runtime_us  ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78
cgroup.event_control   cpuacct.usage         cpu.cfs_quota_us   cpu.shares         notify_on_release
cgroup.procs           cpuacct.usage_percpu  cpu.rt_period_us   cpu.stat           tasks
#切换目录到容器相关配置目录
[root@localhost docker]# cd ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78/
[root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# 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
[root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# cat cpu.cfs_quota_us 
-1
[root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# cat cpu.cfs_period_us
100000
#cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用us表示),默认为100000
#cpu.cfs quota us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。如果设为50000,表示占用50000/100000=50%的CPU。


2.2压力测试

#登录容器
[root@localhost ~]# docker exec -it c1 bash  
[root@ff1dd348e227 /]#
#写个死循环并运行
[root@ff1dd348e227 /]#vi /cpu.sh
[root@ff1dd348e227 /]##!/bin/bash
i=0
while true
do
 let i++
done
#给脚本权限
[root@ff1dd348e227 /]#chmod +x cpu.sh  
#运行脚本
[root@ff1dd348e227 /]#./cpu.sh         
#再开一个终端,查看cpu使用率
[root@localhost ~]#top





2.3 CPU限制

#创建容器c2并进行限制
 [root@localhost ~]# docker run -itd --name c2 --cpu-quota 50000 centos:7
WARNING: IPv4 forwarding is disabled. Networking will not work.
031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f
#查看CPU限额文件
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/
031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f/ ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78/
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f/
[root@localhost 031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f]# cat cpu.cfs_quota_us 
50000
#登录容器
[root@localhost 031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f]# docker exec -it c2 bash
#写个死循环并运行
[root@031972da696b /]# vi /cpu.sh
#!/bin/bash
i=0
while true
do
 let i++
done
#给脚本权限
[root@031972da696b /]# chmod +x cpu.sh
#运行脚本
[root@031972da696b /]#./cpu.sh 
#再开一个终端,查看cpu使用率
[root@localhost ~]#top



2.4 对已存在的容器进行CPU限制

直接修改/sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us文件即可


#进入c1文件目录
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78/
[root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# echo "33000" >cpu.cfs_quota_us
[root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# cat cpu.cfs_quota_us
33000
#此时在进去容器执行之前创建好的脚本
[root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# docker exec -it c1 bash
[root@ff1dd348e227 /]# ./cpu.sh
#再开一个终端,查看cpu使用率
[root@localhost ~]#top



2.5 设置cpu资源占用比(设置多个容器时才有效)

Docker 通过–cpu-shares指定CPU份额,默认值为1024,值为1024的倍数(可以是0.5倍)。

#先删除所有容器
[root@localhost ~]# docker rm -f $(docker ps -aq)
#创建两个容器为c1和c2
#只有这2个容器的情况下,cpu资源分摊给这两个容器,512:1024等于1:2,一个占1/3,一个占2/3
[root@localhost ~]# docker run -itd --name c1 --cpu-shares 512 centos:7
2869e1508ca4d91b5d92d590f11884d4d222ee366a5cffc57a752faf56daf372
[root@localhost ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7
85828ef49abb4010b61d3edafac1e49aac1b2a27fc0d11e936f5a5f56372fe44
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
85828ef49abb   centos:7   "/bin/bash"   8 seconds ago   Up 7 seconds             c2
2869e1508ca4   centos:7   "/bin/bash"   9 seconds ago   Up 8 seconds             c1
[root@localhost ~]#


#分别进入容器,进行压力测试
docker exec -it c1 bash
docker exec -it c2 bash
yum install -y epel-release   #安装在线源
yum install -y stress         #安装检测软件
stress -c 4   #产生四个进程,每个进程都反复不停的计算随机数的平方根






#查看容器运行状态(动态更新)
docker stats


2.6 设置容器绑定指定的CPU

#先分配虚拟机4个CPU核数
docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash
#--cpuset-cpus:指定绑定核数可以是多个


核号是从0开始的,1、3代表第二个核和第四个核



#进入容器,进行压力测试
[root@localhost ~]#docker exec -it c3 bash
[root@81e3ea8f526e /]#yum install -y epel-release
[root@81e3ea8f526e /]#yum install stress -y 
[root@81e3ea8f526e /]#stress -c 4
#执行top命令再按1查看CPU使用情况。
[root@localhost ~]# top
top - 13:41:21 up 4 min,  3 users,  load average: 3.43, 1.30, 0.48
Tasks: 173 total,   5 running, 168 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,   381652 free,   406024 used,  1079372 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  1218384 avail Mem




目录
相关文章
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
76 5
|
12天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
22 3
|
18天前
|
Kubernetes Cloud Native 开发者
探秘云原生计算:Kubernetes与Docker的协同进化
在这个快节奏的数字时代,云原生技术以其灵活性和可扩展性成为了开发者们的新宠。本文将带你深入了解Kubernetes和Docker如何共同塑造现代云计算的架构,以及它们如何帮助企业构建更加敏捷和高效的IT基础设施。
|
25天前
|
安全 Cloud Native Shell
云上攻防:云原生篇&Docker容器逃逸
本文介绍了Docker的基本概念及其对渗透测试的影响,重点讲解了容器逃逸的方法。Docker是一种轻量级的容器技术,与虚拟机相比,具有更高的便携性和资源利用率。然而,这也带来了安全风险,特别是容器逃逸问题。文章详细描述了三种常见的容器逃逸方法:不安全的配置、相关程序漏洞和内核漏洞,并提供了具体的检测和利用方法。此外,还介绍了几种特定的漏洞(如CVE-2019-5736和CVE-2020-15257)及其复现步骤,帮助读者更好地理解和应对这些安全威胁。
云上攻防:云原生篇&Docker容器逃逸
|
30天前
|
Kubernetes Cloud Native Docker
云原生入门:Kubernetes和Docker的协同之旅
【10月更文挑战第4天】在这篇文章中,我们将通过一次虚拟的旅行来探索云原生技术的核心——Kubernetes和Docker。就像乘坐一艘由Docker驱动的小船启航,随着波浪(代码示例)起伏,最终抵达由Kubernetes指挥的宏伟舰队。这不仅是一段技术上的旅程,也是理解现代云架构如何支撑数字世界的冒险。让我们扬帆起航,一探究竟!
|
1月前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
2月前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
2月前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
60 4
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:从Docker到Kubernetes的旅程
【9月更文挑战第16天】 本文将带你进入云原生的世界,从理解Docker容器的基础开始,逐步深入到Kubernetes集群管理。我们将通过简单的代码示例和实际操作,探索这两个关键技术如何协同工作,以实现更高效、灵活的应用程序部署和管理。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供清晰的指导和实用的知识。
60 11