<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[Linux的buff/cache占用内存过高的解决方法]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[运维管理]]></category>
<pubDate>Thu, 18 Nov 2021 05:48:27 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	<span style="font-size: 18px;"><strong>问题描述</strong></span><br/>最近，公司的开发服务器总是偶尔有一些java服务莫名其妙的停掉。通过排查发现是内存不足，奇怪的是，内存只是用了一半，但是可用的却只有不到1G（峰值时估计更少）。下面是具体的内存使用信息：<br/><a href="https://www.heckjj.com/attachment.php?fid=209" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=209" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>可以看到，可用的内存只有888M，内存共有62G，罪魁祸首就是这个buff/cache占用了27G。<br/><br/><span style="font-size: 18px;"><strong>产生原因</strong></span><br/>Linux操作系统频繁存取文件会导致内存被用光，即便是程序结束后也不会被正常释放，这就会导致buffers和cached占用过高。<br/>首先，简单了解一下buff/cache的介绍：<br/><br/>total：是指计算机总物理内存；<br/>used：已用的内存；<br/>free：空余的内存；<br/>total = used + free总内存；<br/>shared：被多个进程共享的内存；<br/>buffers：用于存放要输出到disk（块存储）的数据，在这里buff是指被OS buffer住的内存；<br/>cached：存放从disk上读出的数据；buffer和cache是为了提高IO性能并由OS管理。<br/><br/><span style="font-size: 18px;"><strong>解决方法</strong></span><br/>Linux具有先进的缓存机制，会针对dentry、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。但是在进行了大量文件操作之后，缓存会把内存资源基本用光,虽然文件读取效率提高了，但是物理内存会逐渐被吃光。<br/>因为服务进行了频繁的文件读写操作，但是为什么操作系统不会主动回收呢，原来是因为drop_caches的默认参数设置的就是不释放的。<br/>drop_caches的值可以是0-3之间的数字，代表不同的含义：<br/><br/>0：不释放（系统默认值）<br/>1：释放页缓存<br/>2：释放dentries和inodes<br/>3：释放所有缓存<br/><br/>我们可以用下面的命令来释放缓存：<br/><br/># sync&nbsp;&nbsp;<br/># echo 1 &gt; /proc/sys/vm/drop_caches<br/># echo 2 &gt; /proc/sys/vm/drop_caches<br/># echo 3 &gt; /proc/sys/vm/drop_caches<br/># sync<br/><br/>执行完命令后，free -h 查看内存，发现可用内存已经达到27G，buff/cache也被释放。<br/><a href="https://www.heckjj.com/attachment.php?fid=210" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=210" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>这样只是暂时解决问题，我们可以写一个脚本配合定时任务来定时检查清除缓存：<br/><br/>#!/bin/bash<br/>Mem=$(free -m &#124; awk &#039;NR==2&#039; &#124; awk &#039;&#123;print $4&#125;&#039;)<br/>if [ $Mem -gt 1024 ];<br/>&nbsp;&nbsp;&nbsp;&nbsp; then<br/>echo &quot;Service memory capacity is normal!&quot; &gt; /dev/null<br/>&nbsp;&nbsp;&nbsp;&nbsp; else<br/>sync<br/>echo &quot;1&quot; &gt; /proc/sys/vm/drop_caches<br/>echo &quot;2&quot; &gt; /proc/sys/vm/drop_caches<br/>echo &quot;3&quot; &gt; /proc/sys/vm/drop_caches<br/>sync<br/>fi<br/><br/>最后，只需将脚本加入定时任务，即可！
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] Linux的buff/cache占用内存过高的解决方法]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>