容器内存占用之系统cache介绍
缘起 监控上看到容器内存已经撑爆了,但进去一查,进程列表里根本找不到哪个进程在吃内存。用 awk 把容器所有进程的 RSS 加起来,算出来的值离内存上限还差一大截。这到底是怎么回事? 分析 第一个念头:难道是 docker stats 算错了? 进 /sys/fs/cgroup/memory/doc
缘起
监控上看到容器内存已经撑爆了,但进去一查,进程列表里根本找不到哪个进程在吃内存。用 awk 把容器所有进程的 RSS 加起来,算出来的值离内存上限还差一大截。这到底是怎么回事?
分析
第一个念头:难道是 docker stats 算错了?
进 /sys/fs/cgroup/memory/docker/xxxxx/ 看 memory.usage,数值和监控一致——计算没错。那就得往另一个方向想了:系统内存里有一部分会被 buffer 和 cache 占掉,Linux 内核把这部分也算在“已使用”里。对容器来说,会不会也出现同样的“误会”?而且很可能某个容器触发的文件缓存(cache)被算到了它自己的头上。
验证方法很简单:进容器里 dd 一个大文件看看。果然,dd 之后 docker stats 显示的已用内存立刻飙升。再回到宿主机执行 echo 3 > /proc/sys/vm/drop_caches,容器监控的已用内存又降回去了。原因浮出水面。
问题
对于宿主机,计算内存占用时可以拿“已用内存”减去 cache/buffer 来得到真实使用量。那容器呢?如果不减去它自己引发的 cache/buffer,就会导致误报警。实际测试发现:dd 产生的文件缓存占用的内存,会被计入 inactive_file 这个指标里。这意味着,监控报警规则里如果只盯着总内存,很可能就被 cache 部分骗了。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。







