1. Liunx cgroup

使用 namespace 隔离运行环境,使得进程像在独立环境中运行一样。然而,仅有隔离环境还不够,还得限制被 namespace 隔离的资源。否则,namespace 将不限制的访问系统资源。并且,当系统资源耗尽时内核会触发 OOM 杀死不想关的进程。

Liunx 提供 cgroup 对资源进行管理,它可以限制被 namespace 隔离的资源,同时可以对资源设置权重,计算使用量,控制进程/线程启停等。

(详细信息可查看 man cgroup 和 这里 )

2. docker cgroup

在 docker 的 cgroup 实现中,docker daemon 会在每个子系统的控制组目录下创建名为 docker 的控制组。然后,在控制组下为每个容器创建以容器 ID 为名的容器控制组。 以限制容器的 CPU 为例创建容器:

root@chunqiu:/# docker run -d --cpu-shares 30 --cpu-quota 25000 --cpu-period 1000 --name chunqiu sleep infinity
25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00
root@chunqiu:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
25dbad77c117 5bafba9edb0b "sleep infinity" 4 seconds ago Up 2 seconds chunqiu

查看容器控制组:

root@chunqiu:/sys/fs/cgroup/cpu/docker# ls
25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00 cpuacct.stat cpu.cfs_period_us cpu.stat
cgroup.clone_children cpuacct.usage cpu.cfs_quota_us notify_on_release
cgroup.procs cpuacct.usage_percpu cpu.shares tasks
root@chunqiu:/sys/fs/cgroup/cpu/docker# cd 25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00/
root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# ls
cgroup.clone_children cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.stat tasks
cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.shares notify_on_release
root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat tasks
15331
root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat cpu.cfs_quota_us
25000
root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat cpu.shares
30
root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat cpu.cfs_period_us
1000

可以看到,容器的资源(进程 15331)写入到 cgroup 控制组中,实现了对容器访问系统资源的限制。

进入容器,开启另一个进程,查看该进程是否加入到容器控制组:

/* 进入容器开启一个 bash 进程 */
root@chunqiu:/sys/fs/cgroup/cpu/docker# docker exec -it chunqiu /bin/bash
bash-5.0$

查看容器控制组:

root@chunqiu:/sys/fs/cgroup/cpu/docker/25dbad77c117efc91b03fd76162ffbab01d2c2ada42ac3d25baa00c97a693e00# cat tasks
15331
15890
root@chunqiu:/# ps -ef | grep 15313 | grep -v grep
root 15313 817 0 07:52 ? 00:00:00 containerd-shim /var/run/docker/runtime-runc
9999 15331 15313 0 07:52 ? 00:00:00 /usr/bin/sleep infinity
9999 15890 15313 0 08:15 pts/0 00:00:00 /bin/bash

容器中加入了新进程 15890,它是容器中的 bash 进程,cgroup 对容器控制组的 sleep 和 bash 进程进行了限制。

docker 资源限制之 cgroup的更多相关文章

  1. Docker资源限制实现——cgroup

    摘要 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越广泛.Docker资源管理包含对CPU.内存.IO等资源的限制,但大部分Docker使用者在使用资源管理接口时往往还比较模糊. 本 ...

  2. Docker资源限制与Cgroups

    一.Linux control groups 简介     Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如 ...

  3. Docker资源网站收藏

    Docker资源 Docker官方英文资源: docker官网:http://www.docker.com Docker windows入门:https://docs.docker.com/windo ...

  4. 你可能不知道的Docker资源限制

    What is 资源限制? 默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源.Docker提供了一种控制分配多少量的内存.CPU或阻塞I/O给一个容器的方式,即通过在dock ...

  5. Docker 资源 | 官方文件

    Docker资源 Docker官方英文资源: docker官网:http://www.docker.com Docker windows入门:https://docs.docker.com/windo ...

  6. Docker 资源汇总

    Docker 资源汇总 Docker官方英文资源 Docker官网:http://www.docker.com Docker Windows 入门:https://docs.docker.com/do ...

  7. docker资源隔离实现方式

    默认情况下,一个容器没有资源限制,几乎可以使用宿主主机的所有资源.docker提供了控制内存.cpu.block io.但是实际上主要是namespace和cgroup控制资源的隔离. Docker的 ...

  8. 如何快速清理 docker 资源

    如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察觉的应该是对磁盘空间的占用.本文将介绍如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无 ...

  9. Docker资源限制

    我们在容器中运行docker镜像的时候,可以指定一些设置容器cpu和内存的相关参数来进行限制,这样子尽量把容器资源做的相对稳定一些.这些参数是在docker run/create命令使用,比如: -- ...

  10. docker 资源限制

    docker run 时使用-m指定可以使用的内存大小, 记录在cgroup配置文件中 cat /sys/fs/cgroup/memory/memory.limit_in_bytes jvm内存会超过 ...

随机推荐

  1. Redis入门实践

    安装Redis 下载:官网:https://redis.io/download/,选择稳定版下载. 上传至linux 解压Redis:tar -zxvf redis-6.2.7.tar.gz,得到: ...

  2. 神经网络优化篇:详解dropout 正则化(Dropout Regularization)

    dropout 正则化 除了\(L2\)正则化,还有一个非常实用的正则化方法--"Dropout(随机失活)". 假设在训练上图这样的神经网络,它存在过拟合,这就是dropout所 ...

  3. 华企盾DSC导入离线客户端没有获取到信息

    安装客户端的时候禁用了网卡,导致导入离线客户端获取不到信息. 解决方法: 1.启用网卡,重启电脑 2.启用网卡,重装客户端

  4. 关于SpringBoot中出现的循环依赖问题

    环境: SpringBoot2.7.8 背景: 在增加出库订单时需要对物品表的的数量进行修改 因此我在OutboundController中创建了几个公共方法,并将其注入到Spring中,结果给我报了 ...

  5. ElasticSearch之cat pending tasks API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/pending_tasks?v=true&pretty" --cacert ...

  6. Python——第一章:占位——pass

    pass: 常用于代码占位 a = 10 if a > 100: pass 当设计代码时,有些条件或代码还没有想好要如何处理,先用pass做占位,后续可以回来继续写.如果不写pass则会报错,因 ...

  7. Programming abstractions in C阅读笔记:p181-p183

    <Programming Abstractions In C>学习第61天,p181-p183总结. 一.技术总结 1.linear search algorithm 2.lexicogr ...

  8. java中的数据库连接池

    常见的连接池的优缺点: HikariCP 优点: 性能出色,尤其在高并发负载下表现良好 内存消耗低,占用系统资源较少 具有自动化的连接池维护和统计功能 缺点: 需要 JDK7 或以上版本支持 配置选项 ...

  9. 大地经纬度坐标系与Web墨卡托坐标系的转换

    目录 1. 概述 2. 实现 3. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了大地坐标系/地理坐标系的概念,简单来说就是由经度.纬度以及高程(BLH ...

  10. GaussDB(for Redis)多租户:读写权限控制和数据库隔离的完美融合

    本文分享自华为云社区<GaussDB(for Redis)企业级特性揭秘之多租户管理>,作者: GaussDB 数据库 . 华为云GaussDB(for Redis)持续完善企业级增强特性 ...