Linux读写文件时的缓存机制与windows不同,以致于读写大文件时cached值非常大且居高不下。近几天用Oracle,发现oracle狂用内存,经常内存小到10M的规模。汗一个,赶快让经理买了新的1G内存来装,上去后发现根本认不出来。加班一多小时才发现386内核根本不认高端内存(HIGHMEM),所以内存极限一直是896M。以前是1G内存,所以看不出来,现在换了1.5G,看出来了。赶快上了一个2.6.12-1-686的内核,然后重启,认出来了。不过free还是只有32M左右,我们大惊小怪的打电话到oracle那里去咨询,得到的答复是要安装完整的补丁,并且要用oracle认证过的服务器。oracle认证了啥服务器?RedHatEnterpriseAS3/4,那个东西要收费的,而且绝对不便宜。最后无奈,做了一次不启动oracle的测试。出乎我们意料的,mysql吃了多数的内存。具体造成这种状况的原因是啥呢?偶查阅了linux内存管理资料,发现linux的内存管理计数上讲的东西和windows讲的有很大差异。下面具体列举下几种计数、查看方式和含义。total mem,可以用top free查看出来。 free mem,可以用top free vmstat查看出来。 used mem,可以用top free查看出来. buffer mem,可以用top free vmstat查看出来。 shared mem,可以用free查看出来。 swap mem,可以用top查看出来。 swap used,可以用top vmstat查看出来。 cached mem,可以用top free vmstat查看出来。 active mem,可以用free vmstat -a查看出来,即cached used。 inactive mem,可以用free vmstat -a查看出来,即cached free。其中total mem是除去系统外的可用内存,系统大约占1M多。然后分配给free mem和used mem。used mem又包括了内核表使用(例如GDT),程序使用,buffer,cached。所以cached mem=active mem+inactive mem total mem=free mem+used mem used mem=内核表使用+程序使用物理内存+buffer mem+cached mem略去内核表使用,这个式子可以变形成这样:程序使用总内存=swap used+程序使用物理内存 =swap used+used mem-buffer mem-cached mem =total mem-free mem+swap used-buffer mem-cached mem