网站首页 > 博客文章 正文
上一篇文章介绍了cgroup关于CPU限制,相比CPU限制,内存的限制相对简单很多,Docker 支持在启动时设定容器的内存使用如下参数
-m, --memory string #内存限制
--memory-swap string #内存+swap
主要是设置内存以及交换内存的大小。譬如
# docker run -it -m 300M busybox sh -c “cat /sys/fs/cgroup/memory/memory.limit_in_bytes
&& cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes“
314572800
629145600
这里我故意省去了memory-swap参数设置,因为在设置了内存的情况下,默认的交换分区大小和内存相同,那么总的内存(内存+交换)就是内存的两倍。
首先看一下cgroup关于内存的限制有哪些参数,当进入cgroup挂载目录(/sys/fs/cgroup/memory/)下主要有以下这些参数
cgroup.event_control #用于eventfd的接口
memory.usage_in_bytes #显示当前已用的内存
memory.limit_in_bytes #设置/显示当前限制的内存额度
memory.failcnt #显示内存使用量达到限制值的次数
memory.max_usage_in_bytes #历史内存最大使用量
memory.soft_limit_in_bytes #设置/显示当前限制的内存软额度
memory.stat #显示当前cgroup的内存使用情况
memory.use_hierarchy #设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
memory.force_empty #触发系统立即尽可能的回收当前cgroup中可以回收的内存
memory.pressure_level #设置内存压力的通知事件,配合cgroup.event_control一起使用
memory.swappiness #设置和显示当前的swappiness
memory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
memory.oom_control #设置/显示oom controls相关的配置
memory.numa_stat #显示numa相关的内存
可以看到主要有两个方面的作用:一方面是控制相关,另一方面是统计监控相关,下面通过例子介绍一下如何通过cgroup控制top命令的内存使用。
# cd /sys/fs/cgroup/memory/test/
# sh -c “echo $ >> cgroup.procs“
# top
打开一个新的窗口,查看top命令已经加入cgroup
# cat tasks
1271 /*上面的bash*/
3562 /*上面的top*/
这里回顾之前cgroup基本知识,bash fork出来的子进程top默认也会加入cgroup中。并且可以看到top的限制使用的内存和当前使用的内存
# cat memory.limit_in_bytes
9223372036854771712 /*目前还未限制*/
# cat memory.usage_in_bytes
1642496
可以看到使用了1604KB的内存,下面开始限制他的内存使用
echo 1000K > memory.limit_in_bytes
然后查看top命令的内存占用
# cat memory.limit_in_bytes
1022976
可以看到已经通过cgroup限制了top命令的内存占用,上述的实验在部分内核执行会出现“Device or resource busy”的错误,那是因为在内核不允许设置上限小于当前使用内存,不过这并不影响实验效果,我们可以先设置内存使用,然后执行一些消耗内存的进程。看下面的例子
# cd /sys/fs/cgroup/memory/
# mkdir foo
# cd foo
# echo 8000000 > memory.limit_in_bytes
# echo 8000000 > memory.memsw.limit_in_bytes
# echo $ > tasks
# dd if=/dev/zero | read x
这个例子非常简单,首先设置内存和交换分区为8MB,然后读取不停地将数据读入内存,很快便会触发OOM。关于OOM的文章参考之前文章:OOM时候会杀死哪个进程,这里补充一下上面的参数类别中的memory.oom_control,它主要是控制当出现OOM的时候是否执行杀死进程。
- 上一篇: 从零开始入门 K8s | 深入剖析 Linux 容器
- 下一篇: docker容器网络
猜你喜欢
- 2025-01-09 Kubernetes(k8s)pod详解
- 2025-01-09 「Docker」命令使用大全,全集一览
- 2025-01-09 Docker:关于 Dockerfile 编写优化的一些笔记整理
- 2025-01-09 第6课 Kubernetes之深入掌握Pod机制及应用
- 2025-01-09 Docker 大势已去,Podman 即将崛起
- 2025-01-09 Docker 47 个常见故障的原因和解决方法
- 2025-01-09 Web即终端——基于GoTTY,ttyd通过Web共享终端
- 2025-01-09 K8S Pod 的生命周期
- 2025-01-09 如何管理distroless容器
- 2025-01-09 Cloudflare代理docker镜像仓库的两种方式
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 359℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)