为什么 /proc/sys/vm/drop_caches 的值不归零?

首先,在 Linux 下清理缓存是毫无意义的,只有弊,没有利。原因可参考下文。
[Linux ate my ram!]
http://www.linuxatemyram.com/

然而有些用户就是坚持要清理缓存,牺牲性能也愿意,于是就有了以下清理缓存的方法:

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

执行完上述命令,我们可以观察到 drop_caches 的值一直保持在3,没有变回0:

# cat /proc/sys/vm/drop_caches 
3

如果这个值一直为3,系统会一直不停地清理缓存吗? 不会的,只有执行对 drop_caches 的写操作的时候,才会触发清理缓存:

/* Linux/kernel/sysctl.c  */
1350         {
1351                 .procname       = "drop_caches",
1352                 .data           = &sysctl_drop_caches,
1353                 .maxlen         = sizeof(int),
1354                 .mode           = 0644,
1355                 .proc_handler   = drop_caches_sysctl_handler,
1356                 .extra1         = &one,
1357                 .extra2         = &four,
1358         },

/* Linux/fs/drop_caches.c  */
 42 int drop_caches_sysctl_handler(struct ctl_table *table, int write,
 43         void __user *buffer, size_t *length, loff_t *ppos)
 44 {
 45         int ret;
 46 
 47         ret = proc_dointvec_minmax(table, write, buffer, length, ppos);
 48         if (ret)
 49                 return ret;
 50         if (write) {
 51                 static int stfu;
 52 
 53                 if (sysctl_drop_caches & 1) {
 54                         iterate_supers(drop_pagecache_sb, NULL);
 55                         count_vm_event(DROP_PAGECACHE);
 56                 }
 57                 if (sysctl_drop_caches & 2) {
 58                         drop_slab();
 59                         count_vm_event(DROP_SLAB);
 60                 }
 61                 if (!stfu) {
 62                         pr_info("%s (%d): drop_caches: %d\n",
 63                                 current->comm, task_pid_nr(current),
 64                                 sysctl_drop_caches);
 65                 }
 66                 stfu |= sysctl_drop_caches & 4;
 67         }
 68         return 0;
 69 }
 70