<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[关于Linux使用的真实内存]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Linux技术]]></category>
<pubDate>Wed, 18 May 2011 15:17:37 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	<p align="left">我们使用的Linux和Windows可不太一样，用top命令得出来的可能不是真实使用的内存，用free命令第二行才是系统真实使用的内存。如 果发现PHP-CGI把你的内存占满了可不要惊慌哦。<br/> <br/>Page cache和buffer cache一直以来是两个比较容易混淆的概念，在网上也有很多人在争辩和猜想这两个cache到底有什么区别，讨论到最后也一直没有一个统一和正确的结 论，在我工作的这一段时间，page cache和buffer cache的概念曾经困扰过我，但是仔细分析一下，这两个概念实际上非常的清晰。如果能够了解到这两个cache的本质，那么我们在分析io问题的时候可 能会更加得心应手。<br/> <br/>Page cache实际上是针对文件系统的，是文件的缓存，在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘，这种映射关系由文件系统来完成。当page cache的数据需要刷新时，page cache中的数据交给buffer cache，但是这种处理在2.6版本的内核之后就变的很简单了，没有真正意义上的cache操作。<br/> <br/>Buffer cache是针对磁盘块的缓存，也就是在没有文件系统的情况下，直接对磁盘进行操作的数据会缓存到buffer cache中，例如，文件系统的元数据都会缓存到buffer cache中。<br/> 简单说来，page cache用来缓存文件数据，buffer cache用来缓存磁盘数据。在有文件系统的情况下，对文件操作，那么数据会缓存到page cache，如果直接采用dd等工具对磁盘进行读写，那么数据会缓存到buffer cache。<br/> 补充一点，在文件系统层 每个设备都会分配一个def_blk_ops的文件操作方法，这是设备的操作方法，在每个设备的inode下面会存在一个 radix tree，这个radix tree下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。如果设备做了文件系统，那么会生成一个 inode，这个inode会分配ext3_ops之类的操作方法，这些方法是文件系统的方法，在这个inode下面同样存在一个radix tree，这里会缓存文件的page页，缓存页的数量在top程序的cache一栏进行统计。从上面的分析可以看出，2.6内核中的buffer cache和page cache在处理上是保持一致的，但是存在概念上的差别，page cache针对文件的cache，buffer是针对磁盘块数据的cache，仅此而已。<br/> <br/>现在不都是只有page cache了吗？ buffer pages其实也是page cache里面的页。只是多了一层抽象，通过buffer_head来进行一些访问管理<br/> 对,从Linux算法实现的角度，page cache和buffer cache目前是一样的，但是从功能抽象和具体应用来讲，这两者还是存在区别的，这一点可以从top工具的统计信息中看得出来，关注一下buffer和 cache这两个统计量。<br/> 增加一些资料：<br/> A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.<br/> 在终端中敲入：free<br/> 显 示： total&nbsp;&nbsp;used&nbsp;&nbsp;free&nbsp;&nbsp;shared&nbsp;&nbsp;buffers&nbsp;&nbsp;cached<br/> Mem:&nbsp;&nbsp;&nbsp;&nbsp;255268 238332&nbsp;&nbsp;16936&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;85540&nbsp;&nbsp;&nbsp;&nbsp;126384<br/> -/+ buffers/cache:26408&nbsp;&nbsp;228860<br/> 系统的总物理内存：255268Kb（256M），但系统 当前真正可用的内存并不是第一行free 标记的 16936Kb，它仅代表未被分配的内存。<br/> 我们使用total1、used1、 free1、used2、free2 等名称来代表上面统计数据的各值，1、2 分别代表第一行和第二行的数据。<br/> total1：表示物理 内存总量。<br/> used1：表示总计分配给缓存（包含buffers 与cache ）使用的数量，但其中可能部分缓存并未实际使用。<br/> free1：未被分配的内存。<br/> shared1：共享内存，一般系统不会用到，这里也不讨论。<br/> buffers1： 系统分配但未被使用的buffers 数量。<br/> cached1：系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。<br/> used2：实际使用的buffers 与cache 总量，也是实际使用的内存总量。<br/> free2：未被 使用的buffers 与cache 和未被分配的内存之和，这就是系统当前实际可用内存。<br/> 可以整理出如下等式：<br/> total1 = used1 + free1<br/> total1 = used2 + free2<br/> used1 = buffers1 + cached1 + used2<br/> free2 = buffers1 + cached1 + free1</p><br/>Tags - <a href="http://www.zhanghaijun.com/tags/linux/" rel="tag">linux</a> , <a href="http://www.zhanghaijun.com/tags/%25E5%2586%2585%25E5%25AD%2598/" rel="tag">内存</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] 关于Linux使用的真实内存]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>