触动机制:
1.进程或者手工调用sync().
2.grow_buffers( )分配buffer page失败
3.free_more_memory() or try_to_free_pages() reclaim失败
4.mempool_alloc()分配失败
5.更多场景,当进程dirty pages达到阈值时,/proc/sys/vm/dirty_background_ratio(默认10%),调用 background_writeout()回收。
pdflush调用background_writeout(),指定刷新nr_pages。
过程中,当脏页在/proc/sys/vm/dirty_ratio(默认30%)以下时,停止刷新,如果脏页比例还在30%以上,往page_cache写将block。
刷新内存范围包括page cache dirty pages,super block dirty pages,device dirty pages等。
在Linux中每次用free查看的时候,发现free的空间都只有500M左右。同样的环境32G只剩下这点,64G的也只剩下这么一点。后来发现都被Cache占用了,因为服务器上运行了Kafka环境,每周的日志文件都有一二百G的,估计就是他占用了page cache吧。
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。
Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。也可以用动释放,释放的时候需要对cache中的数据跟对应文件中的数据一致。
释放的方式有下以几种
一般情况下释放pagecache就可以了。这样可以写一个sh脚本来在服务器空闲的时候定时执行
使用crontab来设置定时任务,如每天4点开始清理
本文参考: https://www.jianshu.com/p/9b9f4917fb2e
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)