page cache在容器中的影响

1,053 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

通常运行容器(包括独立容器和k8s pod中的容器)时,会对容器使用内存资源做限制。该限制都是通过cgroup的内存子系统实现,其限制包括rss和page cache两部分。

page cache memory,由组内进程first touch的page cache之和
rss 包括anonymous和swap cache memory,组内所有进程已分配的匿名内存之和

Page Cache的主要作用是提高磁盘文件的读写性能,因为系统调用 read() 和 write() 的缺省行为都会把读过或者写过的页面存放在Page Cache里。
page cache是由内核管理的,包括它的回收策略:LRU,但是在cgroup内存子系统中,是计数在第一个创建它的进程所在的内存cgroup中。当某个内存控制组的内存使用达到限制时,触发page frame reclaim回收inactive page,而这个回收操作是系统级的,它回收的不一定是该控制组内的inactive page,而是整个操作系统中最老的inactive page。

假定一个容器,它的rss需求为2G,但需要频繁操作大量文件,此时主机内存资源充足(64G),如果限制该容器内存资源为3G,可以想见内存使用经常达到限制从而触发page cache回收,此时可考虑设置容器内存限制limit设置为比 rss + active file更大一些,同时设置soft_limit比rss稍大一些,以便在系统内存紧张时仍能有基本的内存可用。

如果进一步分析具体是什么文件占用了page cache,可以做出更细致的选择。比如一个容器的page cache都是进程写日志文件产生的,它们占据大部分的memory limit,但它们在刷入磁盘后,很少被需要读写了,可以选择定时主动将其驱逐,尤其是在k8s部署时,因k8s的内存资源没有soft_limit可以设置。

使用vmtouch定向驱逐文件的page cache:
vmtouch -ev {filepath}