作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏linux(个人社区)欢迎您的加入!

为大家推荐一款刷题神奇 点击链接访问牛客网

各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析 

目录

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.1 Cgroup 概念

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

限制资源使用

优先级控制

一些审计或一些统计

挂起进程,恢复执行进程

1.2 Cgroup子系统

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.3 Cgroup示例

[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%

窗口一:将限制为绑定到第一个CPU上且对此CPU的使用率限制为最大0.2.

[root@localhost ~]# docker run --name stress -it --rm --cpuset-cpus 0 --cpus 0.2 lorel/docker-stress-ng:latest stress --cpu 8
窗口二:
[root@localhost ~]# docker stats		#发现CPU使用率最大为20%

  👑👑👑结束语👑👑👑

为大家推荐一款刷题神奇 点击链接访问牛客网

各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐