细节篇(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 的内存会根据新申请的内存大小释放一部分

相关推荐
梁萌1 小时前
Linux安装Docker
linux·运维·docker·helloworld·容器化部署
翱翔-蓝天1 小时前
在 CentOS 系统上安装 ClickHouse
运维·docker·容器
SRExianxian3 小时前
kubernetes存储架构之PV controller源码解读
容器·架构·kubernetes
cdg==吃蛋糕5 小时前
docker代理配置
docker·容器·eureka
web135085886355 小时前
使用docker compose安装gitlab
docker·容器·gitlab
IT机器猫6 小时前
Docker完整技术汇总
运维·docker·容器
董健正6 小时前
Docker安装
docker·容器·docker-compose
gs801406 小时前
替换 Docker.io 的 Harbor 安全部署指南:域名与 IP 双支持的镜像管理解决方案
docker·harbor
coco_1998_26 小时前
nvidia docker, nvidia docker2, nvidia container toolkits区别
docker·容器
团儿.7 小时前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul