某些时候需要把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?
不会,看看代码:
linux/fs/drop_caches.c
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.
linux/kernel/sysctl.c
{ .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
今天的文章Linux 清空缓存命令分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65453.html