某些时候需要把linux 的缓存清理一下。使用时需要区分参数的不同
- 0:不做任何处理,由系统自己管理
- 1清空pagecache
- 2清空dentries和inodes
- 3 清空pagecache、dentries和inodes
说的具体就是 :
echo 1是释放页缓存,echo 2 是释放slab(dentries,inodes),而echo 3就是既释放页缓存,又释放slab。
什么是slab?
To free pagecache: # echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: # echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches
参考 :https://linux-mm.org/Drop_Caches
-------------------------------------------------update 2021/01/23
drop_cache会情况脏页吗?
先说答案,不会的。
看官方这段描述。
让我用蹩脚的英语翻译下吧: 不是毁灭性的操作,也不会释放脏页。如果想释放更多, 先执行sync 也就是手动刷盘,这会使系统上的脏页变少,释放更多内存。
以下内容来自: https://www.dazhuanlan.com/2019/10/05/5d986e3c55468/
linux/fs/drop_caches.c
问题一:echo 写入之后,值不会变,怎么办?会不会一直在drop?
不会,看看代码:
int drop_caches_sysctl_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos) { int ret; ret = proc_dointvec_minmax(table, write, buffer, length, ppos); if (ret) return ret; if (write) { static int stfu; if (sysctl_drop_caches & 1) { iterate_supers(drop_pagecache_sb, NULL); count_vm_event(DROP_PAGECACHE); } if (sysctl_drop_caches & 2) { drop_slab(); count_vm_event(DROP_SLAB); } if (!stfu) { pr_info("%s (%d): drop_caches: %dn", current->comm, task_pid_nr(current), sysctl_drop_caches); } stfu |= sysctl_drop_caches & 4; } return 0; }
write 为True 的时候,才会执行drop 。
另外proc_dointvec_minmax() 这个函数的作用是检查传入的值符合大小,drop_cache 允许的值是1,2,3,4。
Reads/writes up to table->maxlen/sizeof(unsigned int) integer values from/to the user buffer, treated as an ASCII string.
This routine will ensure the values are within the range specified by table->extra1 (min) and table->extra2 (max).
Returns 0 on success.
{
.procname = "drop_caches",
.data = &sysctl_drop_caches,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = drop_caches_sysctl_handler,
.extra1 = &one,
.extra2 = &four,
},
虽然默认值是0,但是如果你尝试写回0,是会失败的:
-> echo 0 > /proc/sys/vm/drop_caches
echo: write error: invalid argument
另外可以看到sysctl_drop_caches 为3(11b) 时,和1,2 做& 操作,都为True,所以都会drop。
问题二:echo 写入4,是什么效果?
4(100b),和1,2做& 操作,都为False,所以不会drop,相当于关闭了drop 功能。
stfu 为静态变量,第一次执行之后,stfu 为4,if (!stfu) 也始终为False。不过感觉这里有个问题,echo 4 一次之后,stfu 会始终为4,即使再echo 1|2|3,都无法改变,虽然能正常drop,但是pr_info 语句无法执行,dmesg 看不到日志,除非重启。
stfu |= sysctl_drop_caches & 4;
参考 :https://linux-mm.org/Drop_Caches
有时候会看到io_wait 很高
avg-cpu: %user %nice %system %iowait %steal %idle 1.75 15.86 32.50 11.62 0.00 38.27 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 18591.20 3021782.40 39254.40 15108912 196272 sdb 18.60 564.80 65.60 2824 328 sdc 10753.20 1828172.80 668.80 9140864 3344 dm-0 1.80 68.80 0.00 344 0 dm-1 38.40 289.60 17.60 1448 88 dm-2 2605.00 430827.20 38.40 2154136 192 dm-3 2623.40 433995.20 48.00 2169976 240 dm-4 2640.00 467483.20 46.40 2337416 232 dm-5 2881.20 496520.00 57.60 2482600 288 dm-6 7.60 0.00 126.40 0 632 dm-7 1.40 0.00 59.20 0 296 dm-8 1.80 0.00 52.80 0 264 dm-9 8.00 0.00 240.00 0 1200 dm-10 5.80 1.60 44.80 8 224 dm-11 0.00 0.00 0.00 0 0 dm-12 0.00 0.00 0.00 0 0 dm-13 2.20 204.80 0.00 1024 0 dm-14 0.00 0.00 0.00 0 0 dm-15 0.40 0.00 3.20 0 16 dm-16 4705.20 784801.60 4880.00 3924008 24400 dm-17 4284.40 706841.60 4720.00 3534208 23600 dm-18 4341.40 669716.80 4452.80 3348584 22264 dm-19 5045.80 858899.20 6580.80 4294496 32904 dm-20 101.80 0.00 4016.00 0 20080 dm-21 118.00 0.00 4937.60 0 24688 dm-22 117.20 0.00 4944.00 0 24720 dm-23 106.40 0.00 4195.20 0 20976 avg-cpu: %user %nice %system %iowait %steal %idle 1.83 15.55 19.35 14.46 0.00 48.81 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 17328.80 3038740.80 50593.60 15193704 252968 sdb 14.20 276.80 72.00 1384 360 sdc 14302.40 2272651.20 1105.60 11363256 5528 dm-0 4.40 70.40 0.00 352 0 dm-1 21.20 147.20 22.40 736 112 dm-2 3913.00 602876.80 91.20 3014384 456 dm-3 3186.80 512590.40 124.80 2562952 624 dm-4 3562.20 561380.80 137.60 2806904 688 dm-5 3619.80 596126.40 115.20 2980632 576 dm-6 2.00 0.00 100.80 0 504 dm-7 11.60 0.00 348.80 0 1744 dm-8 4.60 0.00 104.00 0 520 dm-9 3.20 0.00 83.20 0 416 dm-10 4.60 0.00 36.80 0 184 dm-11 0.00 0.00 0.00 0 0 dm-12 0.00 0.00 0.00 0 0 dm-13 0.00 0.00 0.00 0 0 dm-14 1.60 59.20 0.00 296 0 dm-15 1.60 0.00 12.80 0 64 dm-16 4023.40 656966.40 7571.20 3284832 37856 dm-17 4750.00 976304.00 6043.20 4881520 30216 dm-18 3998.00 646822.40 7980.80 3234112 39904 dm-19 4242.60 760747.20 6931.20 3803736 34656 dm-20 136.60 0.00 5846.40 0 29232 dm-21 146.00 0.00 6102.40 0 30512 dm-22 133.60 0.00 5046.40 0 25232 dm-23 124.60 0.00 4659.20 0 23296 avg-cpu: %user %nice %system %iowait %steal %idle 1.90 21.38 26.90 10.75 0.00 39.08 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 17252.80 2126377.60 36427.20 10631888 182136