手动清理

Writing to this will cause the kernel to drop clean caches,dentries and inodes from memory,causing that memory to become free.

To free pagecache:

1
echo 1 > /proc/sys/vm/drop_caches

To free dentries
and inodes:

1
echo 2 > /proc/sys/vm/drop_caches

To free pagecache,
dentries and inodes:

1
echo 3 > /proc/sys/vm/drop_caches

As this is a non-destructive operation,and dirty objects are notfreeable,the user should run “sync” first in order to make sure allcached objects are freed.

This tunable was added in 2.6.16.

这里有三个级别可以使用:

  • 使用1时只清理pagecahe
  • 使用2清理dentries和inodes(也就是slab缓存,查看方式为:cat/proc/meminfo,SReclaimable表示可回收的内存)
  • 使用3时三者都清理。由于这是一个非破坏性操作而且脏对象不会被释放,因此应当先执行”sync“后再设置这个参数。

自动清理

/proc/sys/vm/min_free_kbytes 该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。当可用内存低于这个参数时,系统开始回收cache内存,以释放内存,直到可用内存大于这个值。

1
2
3
vm.min_free_kbytes=4096000 //单位 kb
vm.swappiness=40
vm.vfs_cache_pressure=200

说明:

  1. 调整min_free_kbytes的目的是保持物理内存有足够的空闲空间,防止突发性的换页。
  2. swapiness缺省为60,减少swapiness会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存。
  3. vfs_cache_pressure的缺省值是100,加大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大,回收的倾向越严重。调整这3个参数的目的就是让操作系统在平时就尽快回收缓冲,释放物理内存,这样就可以避免突发性的大规模换页。
    减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。
    增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes
    总之,vfs_cache_pressure的值:
    小于100的值不会导致缓存的大量减少
    超过100的值则会告诉内核你希望以高优先级来清理缓存。
    其实无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。
    如果将此值设置为10000,系统将会将缓存减少到一个合理的水平。

查看空闲内存阈值:

1
sysctl -a | grep min_free_kbytes

具体设置【重启失效】:

1
2
3
echo 1024000 > /proc/sys/vm/min_free_kbytes //设置1G的阈值
echo 200 > /proc/sys/vm/vfs_cache_pressure
echo 40 > /proc/sys/vm/swappiness


1
2
3
sysctl -w vm.min_free_kbytes=1024000
sysctl -w vm.vfs_cache_pressure=200
sysctl -w vm.swappiness=40

那么Linux空闲内存=102400kb+原始预留空闲内存(如我的是700M左右)。