与其它操作系统一样,GNU/Linux 已经实现了内存的高效管理.但是如果有进程已经占用了内存并且你想清理它,Linux也提供了刷新或者清理缓存的方式。
如何清理Linux的缓存?
每个Linux系统都有三种方式去清理缓存并且在不中断任何程序或者服务的情况下.
- 清理页面缓存
# sync; echo 1 > /proc/sys/vm/drop_caches
-
清理 dentries 和 inodes.
# sync; echo 2 > /proc/sys/vm/drop_caches
- 清理 页面缓存, dentries 和 inodes.
# sync; echo 3 > /proc/sys/vm/drop_caches
以上命令参数的解释:
sync 将刷新这个文件系统缓存.“;”为命令分隔符,在终端的这些命令将依次执行.正如内核文档中提到的,使用 drop_cache 将仅在杀死任何 应用程序/服务 来清理缓存,echo 命令主要是做写入文件的工作.
如果你必须清除磁盘缓存,对于企业生产环境来讲,上面第一条命令的方式是最安全的 "...echo 1 > ..." 将只清理 Page Cache.上面的第三种方式("...echo 3 >")是不被推荐使用在生产环境的,除非你知道这条命令有什么作用,会影响到哪些,它将清理 PageCache,dentries 和 inodes.
通过 Linux内核 来释放缓冲区和缓存也许是一个好主意?
当你使用了各种设置并希望检查它是否确实是在I/O 扩展基准测试上实现的,那么您可以能需要清除缓冲区缓存.综上所述,您可以在不重启系统的情况下清空缓存.
Linux 的设计方式是查询磁盘之前先查看磁盘缓存.如果从缓存中找到了资源,然后这个请求就不会到达磁盘了.如果我们清除了缓存,那磁盘缓存被使用的次数就会减少,而操作系统将会直接从磁盘上寻找资源.
此外,它还会使用系统慢几秒钟,因为缓存被清理后,操作系统所需要的资源需再次被加载到磁盘缓存中.
现在我们将创建一个 shell 脚本去自动清理内存缓存在每天的凌晨2点钟经由cron调度任务.创建一个 cleancache.sh 脚本并添加如下命令行:
#!/bin/bash
# Note, we are using "echo 3", but it is not recommended in production instead use "echo 1"
echo "echo 3 > /proc/sys/vm/drop_caches"
设置 cleancache.sh 文件的权限:
# chmod 755 clearcache.sh
现在你可以无论什么时候都可以来调用此脚本来清理缓存.
打开 crontab 编辑:
# crontab -e
追加在最后面
0 2 * * * /path/to/clearcache.sh
更多关于cron调用任务的,请参照 11 Cron Scheduling Jobs
对生产环境的服务器也使用它自动清理 RAM 缓存也是好主意?
No,它不是.设想这样一种情况:您计划每天凌晨2点清除ram缓存。每天凌晨2点执行脚本,刷新 RAM缓存,不管出于什么原因,总有一天,你的网站上的用户可能超过您的预期,并从您的服务器上寻找资源。
同时脚本运行并清除缓存中的所有内容,现在所有的用户都从磁盘中获取数据,它将导致服务器崩溃并破坏数据库,因此,只有在需要时才清除 ram-cache,并且知道您的打算,否则你就是个疯狂的系统管理员。
怎么清除Linux的交换空间?
如果您想清除交换空间,您可以执行如下命令:
# swapoff -a && swapon -a
您也可以添加如上命令到 cron 脚本,然后理解相关的风险.
# echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'
OR
$ su -c "echo 3 >'/proc/sys/vm/drop_caches' && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'" root
测试完上面的命令后,我们将运行 free -h 命令来对比执行前后的结果:
原文出处:https://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/