<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>memory &#8211; bhzhuOS爱好者(原StartOS爱好者)</title>
	<atom:link href="https://www.bhzhu203.com/tag/memory/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bhzhu203.com</link>
	<description>QQ群号125732839</description>
	<lastBuildDate>Thu, 04 Aug 2016 03:16:36 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>
	<item>
		<title>Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决（续）</title>
		<link>https://www.bhzhu203.com/2016/08/04/linux%e6%9c%8d%e5%8a%a1%e5%99%a8cache%e5%8d%a0%e7%94%a8%e8%bf%87%e5%a4%9a%e5%86%85%e5%ad%98%e5%af%bc%e8%87%b4%e7%b3%bb%e7%bb%9f%e5%86%85%e5%ad%98%e4%b8%8d%e8%b6%b3%e9%97%ae%e9%a2%98%e7%9a%84%e6%8e%92/</link>
		
		<dc:creator><![CDATA[bhzhu203]]></dc:creator>
		<pubDate>Thu, 04 Aug 2016 03:16:36 +0000</pubDate>
				<category><![CDATA[linux知识]]></category>
		<category><![CDATA[going]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memory]]></category>
		<guid isPermaLink="false">http://www.bhzhu203.com/?p=348</guid>

					<description><![CDATA[作者: 大圆那些事 &#124; 文章可以转载，请以超链接形式标明文章原始出处和作者信息  [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2></h2>
<div class="postbody">
<div id="cnblogs_post_body">
<p>作者: <a href="http://www.cnblogs.com/panfeng412/" target="_blank">大圆那些事</a> | 文章可以转载，请以超链接形式标明文章原始出处和作者信息</p>
<p>网址: <a href="http://www.cnblogs.com/panfeng412/archive/2013/12/17/drop-caches-under-linux-system-2.html">http://www.cnblogs.com/panfeng412/archive/2013/12/17/drop-caches-under-linux-system-2.html</a></p>
<p><a href="http://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system.html">前一篇文章</a>里已经描述了具体遇到的问题及一些解决方法。但是还有些疑问点没有搞清楚，进一步学习了Linux系统下内存的分配使用机制，这里有两个资料讲的比较全面：</p>
<p><a href="http://halobates.de/memorywaste.pdf">Where is the memory going? Memory waste under Linux</a></p>
<p><a href="http://www.google.com.hk/url?sa=t&amp;rct=j&amp;q=memory.ppt&amp;source=web&amp;cd=1&amp;ved=0CCgQFjAA&amp;url=http%3a%2f%2fwww-psych.stanford.edu%2f%7Ebigopp%2fMemory.ppt&amp;ei=E-ivUsOaFq2ZiAf-8IGIAg&amp;usg=AFQjCNFpJ10jtn6LJsn6ec3GeGnzfxZTqQ&amp;bvm=bv.57967247,d.aGc&amp;cad=rjt">Where is the memory going?Memory usage in the 2.6 kernel</a></p>
<p>以下记录的是进一步排查的进展情况。</p>
<h1>更深层次的原因</h1>
<p><a href="http://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system.html">前一篇文章</a>里排查到Linux系统中有大量的dentry_cache占用内存，为什么会有如此多的dentry_cache呢？</p>
<p>1. 首先，弄清楚dentry_cache的概念及作用：目录项高速缓存，是Linux为了提高目录项对象的处理效率而设计的；它记录了目录项到inode的 映射关系。因此，当应用程序发起stat系统调用时，就会创建对应的dentry_cache项（更进一步，如果每次stat的文件都是不存在的文件，那 么总是会有大量新的dentry_cache项被创建）。</p>
<p>2. 当前服务器是storm集群的节点，首先想到了storm相关的工作进程，strace一下storm的worker进程发现其中有非常频繁的stat系统调用发生，而且stat的文件总是新的文件名：</p>
<div class="cnblogs_code">
<pre>sudo strace -fp &lt;pid&gt; -e trace=stat</pre>
</div>
<p>3. 进一步观察到storm的worker进程会在本地目录下频繁的创建、打开、关闭、删除心跳文件，每秒钟一个新的文件名：</p>
<div class="cnblogs_code">
<pre>sudo strace -fp &lt;pid&gt; -e trace=open,stat,close,unlink</pre>
</div>
<p>以上就是系统中为何有如此多的dentry_cache的原因所在。</p>
<h1>一个奇怪的现象</h1>
<p>通过观察/proc/meminfo发现，slab内存分为两部分：</p>
<div class="cnblogs_code">
<pre>SReclaimable // 可回收的slab
SUnreclaim // 不可回收的slab</pre>
</div>
<p>当时服务器的现状是：slab部分占用的内存，大部分显示的都是SReclaimable，也就是说可以被回收的。</p>
<p>但是通过slabtop观察到slab内存中最主要的部分（dentry_cache）的OBJS几乎都是ACTIVE的，显示100%处于被使用状态。</p>
<div class="cnblogs_code">
<pre>  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
13926348 13926348 <strong>100%</strong>    0.21K 773686       18   3494744K dentry_cache
334040 262056  78%    0.09K   8351       40     33404K buffer_head
151040 150537  99%    0.74K  30208        5    120832K ext3_inode_cache</pre>
</div>
<p>为什么显示可回收的，但是又处于ACTIVE状态呢？求Linux内核达人看到后热心解释下：（</p>
<p>会不会由于是ACTIVE状态，导致dcache没有被自动回收释放掉呢？</p>
<h1>让系统自动回收dcache</h1>
<p>上一小节，我们已经提到，服务器上大部分的slab内存是SReclaimable可回收状态的，那么，我们能不能交给操作系统让他在某个时机自动触发回收操作呢？答案是肯定的。</p>
<p>查了一些关于Linux dcache的相关资料，发现操作系统会在到了内存临界阈值后，触发kswapd内核进程工作才进行释放，这个阈值的计算方法如下：</p>
<p>1. 首先，grep low /proc/zoneinfo，得到如下结果：</p>
<div class="cnblogs_code">
<pre>        low      1
        low      380
        low      12067</pre>
</div>
<p>2. 将以上3列加起来，乘以4KB，就是这个阈值，通过这个方法计算后发现当前服务器的回收阈值只有48MB，因此很难看到这一现象，实际中可能等不到回收，操作系统就会hang住没响应了。</p>
<p>3. 可以通过以下方法调大这个阈值：将vm.extra_free_kbytes设置为vm.min_free_kbytes和一样大，则/proc/zoneinfo中对应的low阈值就会增大一倍，同时high阈值也会随之增长，以此类推。</p>
<div class="cnblogs_code">
<pre>$ sudo sysctl -a | grep free_kbytes       
vm.min_free_kbytes = 39847
vm.extra_free_kbytes = 0
$ sudo sysctl -w vm.extra_free_kbytes=836787  ######1GB</pre>
</div>
<p>4. 举个例子，当low阈值被设置为1GB的时候，当系统free的内存小于1GB时，观察到kswapd进程开始工作（进程状态从Sleeping变为Running），同时dcache开始被系统回收，直到系统free的内存介于low阈值和high阈值之间，停止回收。</p>
<p>&nbsp;</p>
</div>
<div id="MySignature"><a href="http://weibo.com/1830487481?s=6uyXnP"> <img decoding="async" src="http://service.t.sina.com.cn/widget/qmd/1830487481/7c9f6081/1.png" /> </a></div>
</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
