【云原生 20】Docker资源限制详解_docker run 限制资源(1)

1. Cgroup

1.1 Cgroup 概念

1.2 Cgroup子系统

1.3 Cgroup示例

2. 内存资源限制

2.1 内存资源限制参数

3. CPU资源限制

3.1 容器中 CPU 使用

3.2 容器 CPU 限制参数

3.3 资源限制实验

👑👑👑结束语👑👑👑


1. Cgroup

1.1Cgroup概念

Linux Cgroup 全称 Linux Control Group, 是 Linux 内核的一个功能,用来限制,控制与分离一个进程组群的资源(如 CPU、内存、磁盘输入输出等)。这个项目最早是由 Google 的工程师在 2006 年发起,最早的名称为进程容器( process containers )。在 2007 年时,因为在 Linux 内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为 cgroup,并且被合并到 2.6.24 版的内核中去。
限制资源使用 优先级控制 一些审计或一些统计 挂起进程,恢复执行进程

1.2Cgroup子系统

cpu 子系统,主要限制进程的 cpu 使用率

cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告

cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点

memory 子系统,可以限制进程的 memory 使用量

blkio 子系统,可以限制进程的块设备 io

devices 子系统,可以控制进程能够访问某些设备

net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制

net_prio — 这个子系统用来设计网络流量的优先级

freezer 子系统,可以挂起或者恢复 cgroups 中的进程

ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace

hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统

1.3Cgroup示例****

[root@master ~]# mount -t cgroup	        # 查看 Cgroup 挂载点	
[root@master cpu]# cd /sys/fs/cgroup/cpu	# 创建隔离组
[root@master cpu]# mkdir cpu_test

示例代码:

[root@master ~]# yum -y install gcc gcc-c++	    #先安装C语言编译工具
[root@master ~]# vim axp.c			            #创建文件内容如下,文件必须.c结尾。C语言执行的程序。
int main(void)
{ 
    int i = 0;		            #初始值为0
    for(;;) i++;		        #判断条件为空,死循环加下去
    return 0;		            #结束时返回0,但是死循环不肯结束的。
}
[root@master ~]# gcc axp.c           #编译
[root@master ~]# ls                  #查看会有一个.out结尾的文件
[root@master ~]# ./a.out             #运行代码

再开一个窗口

top命令查看cpu使用率

上述代码运行,CUP使用率100%,最大只能100%,因为C语言不支持多核心

[root@master cpu]# echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us
[root@master cpu]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks

2. 内存资源限制

> 默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源       > Docker 限制可以从 Memory(内存)、CPU、Block I/O(磁盘I/O) 三个方面       > OOME报错:Out Of Memory Exception            >> 一旦发生 OOME,任何进程都有可能被杀死,包括 docker daemon 在内            >> 为此,Docker 调整了 docker daemon 的 OOM 优先级,以免被内核关闭

2.1 内存资源限制参数

配额除以周期就是当前CPU资源的利用率 如果使用–oom-kill-disable选项的时候一定要加上-m选项 如果一个容器的软限制和硬限制大小一样,那它的资源会被系统优先分配(最高调度率) M代表物理内存 S代表总内存  S-M代表虚拟内存,即swap交换分区大小 unset代表不设置,为默认值(虚拟内存为2倍的M) -1代表当前物理机有多少虚拟内存(swap大小),当前容器的虚拟内存就有多少。

3. CPU资源限制

3.1 容器中 CPU 使用

> 默认情况下,如果不对容器做任何限制,容器能够占用当前系统中的所有 CPU 资源        > 大多数进程是采用 CFS 调度算法        > 1.13 Docker 版本后支持实时调度算法

3.2 容器 CPU 限制参数

3.3 资源限制实验

示例1:

> docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2 stress命令基于Ubuntu系统,是可以进行压测的命令 选项: -it 交互模式 -rm 退出即删除 -m 内存限制大小 lorel/docker-stress-ng:latest 镜像 stress 启动命令替换为stress -vm 2     以两个进程同时压测内存
[root@localhost ~]# docker pull lorel/docker-stress-ng:latest		#下载
[root@localhost ~]# docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2	#加入物理内存进行压测,
因为值设置了物理内存-m为256m,–memory-swap没有设置,则默认是unset,虚拟内存为2倍的M,即总内存为M+2M=256+2*256 再开一个窗口
窗口二:
[root@localhost ~]# docker stats		#查看发现LIMIT最大内存使用为256MB
窗口一:
发生了OOM报错,即容器内部随机杀死了一些进程

示例2:

> docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
窗口一:
[root@localhost ~]# docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
窗口二:
[root@localhost ~]# docker stats

示例3:

查看发现CPU使用率一直被限制在200%或200%以下,超过一点点很正常,刚检测到200%的时候还没来得及压测就已经超过一点了
> docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8 --cpuset-cpus 0亲核心绑定,CPU如果有4个,则序号为0,1,2,3。所以0代表第一个CPU。 即–cpuset-cpus 0将限制为绑定到第一个CPU上,让第一个CPU进行工作,则CPU利用率最大为100%
窗口一:将限制为绑定到第一个CPU上
[root@localhost ~]# docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
窗口二:
[root@localhost ~]# docker stats		#发现CPU使用率最大为100%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值