1 前言
1.1 摘要
Linux 系统层面定期释放,通常是指 内存(Memory) 的定期释放,尤其是 缓存(cache)、缓冲区(buffers)和页缓存(page cache)。这类释放行为,有助于系统在长期运行时保持良好的内存使用状态,避免内存占用持续升高。
1.2 为什么要定期释放内存缓存?
Linux 系统为了加快文件系统的访问速度,会使用 页缓存(page cache) 来缓存磁盘数据。虽然这些缓存能被自动管理,但在某些场景(如服务器内存较小、大量 I/O 操作等)下,可能希望手动定期释放以释放更多内存供其他应用使用。
2 手动释放内存缓存的方法
Linux 提供了接口可以让我们控制缓存释放
# 查看内存占用情况
free -h

注:top命令可以查询具体占用情况
2.1 临时释放内存缓存
# 清除页缓存
echo 1 > /proc/sys/vm/drop_caches
# 清除目录项和 inode 缓存
echo 2 > /proc/sys/vm/drop_caches
# 清除页缓存、目录项和 inode 缓存(最彻底)
echo 3 > /proc/sys/vm/drop_caches
⚠️ 注意:以上操作不会影响正在运行的程序,但会导致磁盘 I/O 变慢(因为缓存被清掉了)。
3 定期释放(定时任务方式)
3.1 编写脚本
可以通过 cron
定期执行释放操作
mkdir -p /home/cs/corn
vim /home/cs/corn/clear_cache.sh
#!/bin/bash
sync
echo 3 > /proc/sys/vm/drop_caches
sync
的作用是将缓存数据写入磁盘,避免数据丢失。
3.2 赋予执行权限
chmod +x /home/cs/corn/clear_cache.sh
3.3 设置定时任务
每天凌晨 2 点释放一次
crontab -e
0 2 * * * /home/cs/corn/clear_cache.sh >> /home/cs/corn/clear_cache.log 2>&1
4 内核参数优化相关
也可以通过调整内核参数优化内存回收行为
vim /etc/sysctl.conf
# 控制系统多久触发回写 dirty 页缓存(秒)
vm.dirty_expire_centisecs = 3000
# 当系统脏页比例超过这个值时触发回写
vm.dirty_ratio = 20
# 超过多少脏页比例时开始后台回写
vm.dirty_background_ratio = 10
# 内核回收内存的倾向(越大越积极)
vm.swappiness = 10
加载配置
sysctl -p
5 是否推荐频繁手动释放缓存?❗
一般不推荐频繁释放,除非系统资源紧张,或特定应用场景(如批处理服务器、视频转码服务器等)。
Linux 本身的内存管理已经很智能,缓存不等于占用,它会在需要时自动释放。手动释放可能会带来性能损耗。
<h2><a id="1__0"></a>1 前言</h2>
<h3><a id="11__2"></a>1.1 摘要</h3>
<p>Linux 系统层面定期释放,通常是指 <strong>内存(Memory)</strong> 的定期释放,尤其是 <strong>缓存(cache)、缓冲区(buffers)和页缓存(page cache)</strong>。这类释放行为,有助于系统在长期运行时保持良好的内存使用状态,避免内存占用持续升高。</p>
<h3><a id="12__6"></a>1.2 为什么要定期释放内存缓存?</h3>
<p>Linux 系统为了加快文件系统的访问速度,会使用 <strong>页缓存(page cache)</strong> 来缓存磁盘数据。虽然这些缓存能被自动管理,但在某些场景(如服务器内存较小、大量 I/O 操作等)下,可能希望手动定期释放以释放更多内存供其他应用使用。</p>
<h2><a id="2__10"></a>2 手动释放内存缓存的方法</h2>
<p>Linux 提供了接口可以让我们控制缓存释放</p>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">查看内存占用情况</span>
free -h
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/bb7f2f32da0c59eee9e59ee806bf390f.png" alt="CentOS查看内存占用情况" /></p>
<p>注:top命令可以查询具体占用情况</p>
<h3><a id="21__23"></a>2.1 临时释放内存缓存</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">清除页缓存</span>
echo 1 > /proc/sys/vm/drop_caches
<span class="hljs-meta">
# </span><span class="language-bash">清除目录项和 inode 缓存</span>
echo 2 > /proc/sys/vm/drop_caches
<span class="hljs-meta">
# </span><span class="language-bash">清除页缓存、目录项和 inode 缓存(最彻底)</span>
echo 3 > /proc/sys/vm/drop_caches
</code></div></pre>
<p>⚠️ 注意:以上操作不会影响正在运行的程序,但会导致磁盘 I/O 变慢(因为缓存被清掉了)。</p>
<h2><a id="3__38"></a>3 定期释放(定时任务方式)</h2>
<h3><a id="31__40"></a>3.1 编写脚本</h3>
<p>可以通过 <code>cron</code> 定期执行释放操作</p>
<pre><div class="hljs"><code class="lang-shell">mkdir -p /home/cs/corn
vim /home/cs/corn/clear_cache.sh
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta">#</span><span class="language-bash">!/bin/bash</span>
sync
echo 3 > /proc/sys/vm/drop_caches
</code></div></pre>
<p><code>sync</code> 的作用是将缓存数据写入磁盘,避免数据丢失。</p>
<h3><a id="32__57"></a>3.2 赋予执行权限</h3>
<pre><div class="hljs"><code class="lang-shell">chmod +x /home/cs/corn/clear_cache.sh
</code></div></pre>
<h3><a id="33__63"></a>3.3 设置定时任务</h3>
<p>每天凌晨 2 点释放一次</p>
<pre><div class="hljs"><code class="lang-shell">crontab -e
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">0 2 * * * /home/cs/corn/clear_cache.sh >> /home/cs/corn/clear_cache.log 2>&1
</code></div></pre>
<h2><a id="4__75"></a>4 内核参数优化相关</h2>
<p>也可以通过调整内核参数优化内存回收行为</p>
<pre><div class="hljs"><code class="lang-shell">vim /etc/sysctl.conf
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">控制系统多久触发回写 dirty 页缓存(秒)</span>
vm.dirty_expire_centisecs = 3000
<span class="hljs-meta">
# </span><span class="language-bash">当系统脏页比例超过这个值时触发回写</span>
vm.dirty_ratio = 20
<span class="hljs-meta">
# </span><span class="language-bash">超过多少脏页比例时开始后台回写</span>
vm.dirty_background_ratio = 10
<span class="hljs-meta">
# </span><span class="language-bash">内核回收内存的倾向(越大越积极)</span>
vm.swappiness = 10
</code></div></pre>
<p>加载配置</p>
<pre><div class="hljs"><code class="lang-shell">sysctl -p
</code></div></pre>
<h2><a id="5__103"></a>5 是否推荐频繁手动释放缓存?❗</h2>
<p>一般不推荐频繁释放,除非系统资源紧张,或特定应用场景(如批处理服务器、视频转码服务器等)。</p>
<p>Linux 本身的内存管理已经很智能,缓存不等于占用,它会在需要时自动释放。手动释放可能会带来性能损耗。</p>
留言