网站首页 > 技术文章 正文
问题描述:
- 现象: Linux如何自动释放缓存
步骤
- 第一步
- 第二步
- 第三步
日志
文字描述
手动释放缓存和自动释放缓存
在Linux系统中,缓存(Cache)是用于提高文件系统性能的一种机制,它存储了最近访问过的文件数据,以便下次访问时能够更快地读取。然而,在某些情况下,可能需要手动或自动释放这些缓存,例如当系统内存不足时,或者为了确保数据的及时更新。
手动释放缓存:可以使用`sync`命令将缓存中的数据写入磁盘,然后使用`echo 3 > /proc/sys/vm/drop_caches`命令释放缓存。
自动释放缓存:可以使用`cron`定时任务,在系统负载较高时自动释放缓存。例如,在每天凌晨2点执行`echo 3 > /proc/sys/vm/drop_caches`命令释放缓存。
free 与 available 的区别
free 是真正尚未被使用的物理内存数量。
available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)
Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。
buff 和 cache 的区别
cache:文件系统层级的缓存,从磁盘里读取的内容是存储到这里,这样程序读取磁盘内容就会非常快,比如使用grep和find等命令查找内容和文件时,第一次会慢很多,再次执行就快好多倍,几乎是瞬间。但如上所说,如果对文件的更新不关心,就没必要清cache,否则如果要实施同步,必须要把内存空间中的cache clean下
buffer:磁盘等块设备的缓冲,内存的这一部分是要写入到磁盘里的。这种情况需要注意,位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
代码片段
可以通过向/proc/sys/vm/drop_caches文件写入特定的值来手动释放缓存:
echo 1 > /proc/sys/vm/drop_caches:释放页缓存。
echo 2 > /proc/sys/vm/drop_caches:释放dentries和inodes。
echo 3 > /proc/sys/vm/drop_caches:释放所有缓存(页缓存、dentries和inodes)。
# 查看内存使用情况
free -h
total used free shared buff/cache available
Mem: 467.3M 94.0M 308.8M 2.4M 64.5M 360.2M
Swap: 0 0 0
#free + buff/cache 约等于 available,并且会略大约,因为有些不可释放,不能让其使用
# 写文件
dd if=/dev/zero of=test bs=1M count=20
可以看到buff/cache增大
free -h
total used free shared buff/cache available
Mem: 467.3M 94.0M 288.0M 2.4M 85.3M 360.2M
Swap: 0 0 0
# 释放缓存
echo 3 > /proc/sys/vm/drop_caches
# 读文件
dd if=test of=/dev/null bs=1M count=20
# 可以看到buff/cache增大
free -h
total used free shared buff/cache available
Mem: 467.3M 93.8M 289.4M 2.4M 84.1M 360.3M
Swap: 0 0 0
#同时也看下面的参数
cat /proc/meminfo
MemTotal: 478504 kB
MemFree: 295724 kB
MemAvailable: 368812 kB
Buffers: 1108 kB
Cached: 65064 kB
#对文件的读写Cached变化很大,对/dev/mmcblk0px的读写Buffers参数变化很大,例如直接操作dd if=/dev/mmcblk0px
图片
结论
- 问题已解决,性能提升 20%。
待查资料问题
- 问题 1:?
- 问题 2:?
参考链接
- 官方文档
- 上一篇: pdfgrep:PDF 文本搜索的强大工具
- 下一篇: Linux/unix中 grep 正则使用示例
猜你喜欢
- 2025-08-06 聊天讨论 5 个终端技巧!加速你的代码开发效率
- 2025-08-06 Linux文本三剑客:grep/sed/awk组合技,文本处理难题轻松解决
- 2025-08-06 Linux面试最高频的5个基本问题
- 2025-08-06 Linux/unix中 grep 正则使用示例
- 2025-08-06 pdfgrep:PDF 文本搜索的强大工具
- 2025-08-06 java开发常用的Linux命令,高频的没你想象的多
- 2025-08-06 Linux系统中有关mount与umount命令的使用指引
- 2025-08-06 Linux进程管理
- 2025-08-06 Linux三剑客之sed命令详解,小白也能看得懂!
- 2025-08-06 常见文件系统格式有哪些
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1531℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 692℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 536℃MySQL service启动脚本浅析(r12笔记第59天)
- 501℃启用MySQL查询缓存(mysql8.0查询缓存)
- 500℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 469℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 467℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)