细节篇(8):RSS和Page Cache

在一些场景中,比如容器里的应用有很多文件读写,整个容器的内存使用量已经很接近 Memory Cgroup 的上限值了,但接着申请内存,还是可以申请出来,并且没有 OOM。

Linux 内存类型

Linux 的各个模块都需要内存,比如内核需要分配内存给页表,内核栈,还有 slab,也就是内核各种数据结构的 Cache Pool;用户态进程里的堆内存和栈的内存,共享库的内存,还有文件读写的 Page Cache。

Memory Cgroup 不会对内核的内存做限制。主要讨论与用户态相关的两个内存类型,RSS 和 Page Cache。

RSS

RSS 是 Resident Set Size 的缩写,指进程真正申请到物理页面的内存大小。

程序在申请内存时,比如调用 malloc() 申请 100MB 的内存,返回成功,系统其实只是把 100MB 的虚拟地址空间分配给了进程,没有分配物理内存。当进程对内存地址开始做真正读写时,系统才把实际需要的物理内存分配给进程。这个过程中,进程真正得到的物理内存,就是 RSS。

用 malloc 申请 100MB 的内存。

运行 top 查看程序在运行了 malloc() 之后的内存,程序的虚拟地址空间(VIRT)已经有了 106728KB(~100MB),但是实际的物理内存 RSS(top 里显示的是 RES)在这里只有 688KB。

等待30s,再对申请的内存写入20MB数据

用 memset() 对地址空间写入 20MB 的数据后,再用 top 查看

对于进程来说,RSS 内存包含了进程的代码段内存,栈内存,堆内存,共享库的内存。刚才通过 malloc/memset 得到的内存,就属于堆内存。

具体的每一部分的 RSS 内存的大小,可以查看 /proc/[pid]/smaps 文件。

Page Cache

进程除了分配到的 RSS 内存外,如果对磁盘上的文件做了读写操作,Linux 还会分配内存,把磁盘上读写到的页面存放在内存中,这部分的内存就是 Page Cache。

Page Cache 的主要作用是提高磁盘文件的读写性能,因为系统调用 read() 和 write() 的default行为都会把读过或者写过的页面存放在 Page Cache 里。

在 Linux 里只要有空闲的内存,系统就会自动地把读写过的磁盘文件页面放入到 Page Cache 里。但执行 malloc()时,剩余的物理内存不够了,那该怎么办呢?

Linux 的内存管理有一种内存页面回收机制,会根据系统里空闲物理内存是否低于某个阈值,来决定是否启动内存的回收。

内存回收的算法会根据不同类型的内存以及 LRU 算法决定哪些内存页面先被释放。因为 Page Cache 的内存页面只是起到 Cache 作用,自然是会被优先释放的。

所以,Page Cache 是一种为了提高磁盘文件读写性能而利用空闲物理内存的机制。页面回收机制又能保证 Cache 所占用的页面可以及时释放,这样就不会影响程序对内存的真正需求了。

RSS & Page Cache in Memory Cgroup

先从 Linux 的内核代码看一下,从 mem_cgroup_charge_statistics() 这个函数里,可以看到 Memory Cgroup 只统计了 RSS 和 Page Cache 这两部分的内存。

Memory Cgroup 控制组里 RSS 内存和 Page Cache 内存的和,正好是 memory.usage_in_bytes 的值。

当控制组里的进程需要申请新的物理内存,而且 memory.usage_in_bytes 里的值超过控制组里的内存上限,这时 Linux 的内存回收就会被调用。

控制组里的 page cache 的内存会根据新申请的内存大小释放一部分

相关推荐
MickeyCV24 分钟前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
棠十一1 小时前
Rabbitmq
分布式·docker·rabbitmq
藥瓿亭2 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_809798322 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣2 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞2 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技4 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
杨浦老苏4 小时前
轻量级Docker管理工具Docker Switchboard
运维·docker·群晖
江湖有缘4 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
一加一等于二5 小时前
docker部署postgresql17,并且安装插件
docker·postgresql