作者回复: 通过lsof可以查看某个应用打开的文件,然后再使用fincore可以看这些文件有多少内容在pagecache。 或者应用程序里直接调用mincore也可以查看page cache有多少。
作者回复: 是的 赞!
作者回复: echo 2会去尝试释放所有可以回收的slab,但是它释放inode的过程中也会释放inode的page cache,其实这个行为在我看来是不合理的,如果inode上面有page cache就不应该被释放,目前内核社区也在针对这个行为做改进,预计它很快会被修改。另外还有很多inode是不可以被释放的,那这部分inode里的page cache也不会被释放。 echo 1则只是释放page cache,而不去释放slab,而且在释放pagecache的过程中也不会去考虑inode的情况,也就是说echo 2中有些不会释放的pagecache在这种方式里会被释放。
作者回复: 1. 扫描比例是在内核里面配置好的 用户无法调整,第一次扫描1/12,第二次扫描1/11,一直到最后一次扫描全部。通过调整内存水位最终就会体现在zoneinfo里的min low high里面,这几个值也是内核根据内存情况来动态调整的。 2. 如果是直接回收,那只需要会收到满足需求的内存就可以了;如果是kswapd回收,那会一直回收到high水位。
作者回复: 这是cgroup1的memcg参数,memory.high和memory.max在原生内核里只在cgroup2中有,如果你们用的是cgroup1 就无法使用这几个参数了。我们在自己的内核里在cgroup1里也添加了high max这些参数,你们也可以考虑添加下。
作者回复: 把进程放在memory cgroup中,然后进程读写的文件内容都属于这个memory cgroup中;如果进程读写文件后,再把它放在memory cgroup中,那么文件内容不会属于这个memory cgroup。所以要注意顺序。
作者回复: 这要看具体是什么zone,如果是dma zone的话,由于本身这个zone里的内存较少,所以水位小也是正常的。 min low high其实是等差数列,这个差值就主要是由zone的大小来决定的。
作者回复: 这应该是应用在申请内存时触发了直接回收引起的。drop cache之后,就有很多的可用内存,应用就无需回收,但是运行久了,page cache就会积压,导致接下来的内存申请会进行直接回收。 你可以在load高时通过sar -B来观察看看pgscand是否有不为0的情况。
作者回复: inode本身也是slab的一种,在内存不足时,就会去尝试回收slab,回收slab的时候就可能会回收到inode。