语言流氓子跟你聊3分钟容器核心概念cgroup

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 还是容器,之前咱们简单聊了一下namespace,可以把它想象成用来存储进程固定参数的盒子。如果两个进程希望彼此更进一步了解对方,那就把他们的参数放在一个盒子里,仅此而已。

行吧!让我们开始这段感情吧!


还是容器,之前咱们简单聊了一下namespace,可以把它想象成用来存储进程固定参数的盒子。如果两个进程希望彼此更进一步了解对方,那就把他们的参数放在一个盒子里,仅此而已。


OK!这样确实把相同或者不同的进程区分或者归类了。那么问题来了。我们要多大的盒子来存放这个进程?


引入我们今天的主脚cgroup!


定义(抄的):

Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。

大白话:限制进程使用资源的一种内核机制。

既然是限制,那就得有最低值和最高值对吧。然后还有你不能干这个,不能干那个。你得让着点这个,让着点那个。反正就跟交通规则一样。并且呢这个规矩还可以随时变化。你得听,不听就收拾你。人生亦是如此对吧!

那么既然它是一种内核机制。那么要想使用它就得给我们提供了一个接口。这个接口就是我们最最最最常见的文件系统。记账哒!~,,配置文本文件明白没?对!就类似那玩意。


你按他的规定,在规定的文件中写上规定格式的数值它就明白你要干啥了。


一个命令解开cgroup神秘的面纱


hchen@ubuntu:~$ mount -t cgroup
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,relatime,cpuacct)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,relatime,blkio)
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,net_prio)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,relatime,perf_event)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,relatime,hugetlb)


看到没?你只要执行这一句,就能把cgroup给刨出来。


别蒙圈奥,你现在就记住cgroup就是文件系统。文件系统就得可读可写。所以咱们可以往里写东西。


这些目录分别对应着不用的限制项。然后在这里面写一个最大值,写个最小值就完成了限制。


OK,如果只是想弄明白cgroup概念的同志,读到这就行了。你能大概理解是什么玩意了。其实就是一堆配置文件。


想多了解点的同志呢?

640.jpg


先说干的,上面出来那堆玩意是默认的,你也可以自己随便起名创建

上栗子:


测试效果,咱们先来个累死牛脚本(跑CPU的)

x=0
while [ True ];do
    x=$x+1
done;

注意看CPU:

mkdir -p /cgroup/cpu/foo/   #新建一个控制组foo
echo 50000 > /sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us  #将cpu.cfs_quota_us设为50000,相对于cpu.cfs_period_us的100000是50%
echo 30142 > /sys/fs/cgroup/cpu/foo/tasks #写上你要控制额进程PID到这个文件

这个tasks文件名可不能变。就得叫这个名!

再来看


 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND     
30142 root      20   0  105m 2884 1024 R 49.4  0.2  23:32.53 sh 

是不是懂啦?

我们再看刚刚创建的文件夹下面一下就多出好多东西


[root@localhost ~]# ls /sys/fs/cgroup/cpu/foo/
cgroup.event_control  cgroup.procs  cpu.cfs_period_us  cpu.cfs_quota_us  cpu.rt_period_us  cpu.rt_runtime_us  cpu.shares  cpu.stat  notify_on_release  tasks


都是自动生成哒,而且都是控制CPU的哦~

是不是非常简单?再来个内存的例子:

x="a"
while [ True ];do
    x=$x$x
done;


内存给老子起!!!!!

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         30215 root      20   0  871m 501m 1036 R 99.8 26.7   0:38.69 sh  
30215 root      20   0 1639m 721m 1036 R 98.7 38.4   1:03.99 sh 
30215 root      20   0 1639m 929m 1036 R 98.6 49.5   1:13.73 sh


再给老子去死!!!!


mkdir -p /sys/fs/cgroup/memory/foo
echo 1048576 >  /cgroup/memory/foo/memory.limit_in_bytes   #分配1MB的内存给这个控制组
echo 30215 > /cgroup/memory/foo/tasks  


他很听话的:


[root@localhost ~]# sh /home/test.sh 
已杀死


其他的类似,就不演练了。可以自己看看

那么这么挨个写的限制岂不要累死人?

上面那些我们只是简单的说了一下底层的原理,底层都是这么实现的。但是调用方式就不一样了

640.jpg


与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。


  • -m 或 --memory:设置内存的使用限额,例如 100M, 2G。
  • --memory-swap:设置 内存+swap 的使用限额。


当我们执行如下命令:

docker run -m 200M --memory-swap=300M ubuntu


其含义是允许该容器最多使用 200M 的内存和 100M 的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。


下面我们将使用 progrium/stress 镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。执行如下命令:

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
  • --vm 1:启动 1 个内存工作线程。
  • --vm-bytes 280M:每个线程分配 280M 内存。


默认情况下,容器可以使用主机上的所有空闲内存。

与 CPU 的 cgroups 配置类似,docker 会自动为容器在目录 /sys/fs/cgroup/memory/docker/<容器的完整长ID>中创建相应 cgroup 配置文件。


运行结果如下:

640.jpg

在相应的cgroup的目录文件下写上我们所选的相关参数对其运行的容器进行限制。


总结一下:

cgroup就是一个叫cgroup的文件系统,我们可以在里面写相应的参数。然后再把相应的进行PID写进去就可以限制进程的资源使用啦!

简单不?哈哈哈哈哈哈!


下期写JWT认证吧,最近写的项目用到了。

非常牛叉的东西!

相关文章
|
6月前
|
存储 监控 安全
【专栏】探讨Docker Compose的核心概念、使用方法及最佳实践,助你轻松驾驭容器编排的世界
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
429 2
|
6月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
6月前
|
运维 Java Go
Go语言基础及其在容器化应用中的优势
【2月更文挑战第23天】本文首先介绍了Go语言的基本特性和优势,然后详细阐述了Go语言在容器化应用中的重要作用和独特优势。通过深入分析Go语言的语法简洁性、并发处理能力和内存管理特性,以及Docker容器技术的轻量级、可移植性和版本控制特点,本文旨在说明Go语言与Docker容器技术的结合能够显著提升应用的开发效率和部署灵活性,为现代软件开发和运维带来革命性的变革。
|
6月前
|
存储 程序员 C++
在C++语言中容器的适配器
在C++语言中容器的适配器
48 0
|
2月前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
211 3
|
3月前
|
Linux 持续交付 虚拟化
在Linux中,Docker和容器虚拟概念是什么?
在Linux中,Docker和容器虚拟概念是什么?
|
3月前
|
消息中间件 Kubernetes 数据库
在k8S中,初始化容器(init container)概念原理是什么?
在k8S中,初始化容器(init container)概念原理是什么?
|
6月前
|
存储 缓存 安全
Golang深入浅出之-Go语言中的并发安全容器:sync.Map与sync.Pool
Go语言中的`sync.Map`和`sync.Pool`是并发安全的容器。`sync.Map`提供并发安全的键值对存储,适合快速读取和少写入的情况。注意不要直接遍历Map,应使用`Range`方法。`sync.Pool`是对象池,用于缓存可重用对象,减少内存分配。使用时需注意对象生命周期管理和容量控制。在多goroutine环境下,这两个容器能提高性能和稳定性,但需根据场景谨慎使用,避免不当操作导致的问题。
199 7
|
6月前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
6月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
下一篇
无影云桌面