linux cache总结

来源:互联网 发布:软件测试技术语言 编辑:程序博客网 时间:2024/05/17 05:57

1、cache

PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory。
有时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存free项会很少,此时查看系统的 /proc/meminfo 文件,会发现有一项 Cached Memory:
输入cat /proc/meminfo查看:
MemTotal: 16425996 kB
MemFree: 5698808 kB
Buffers: 380904 kB
Cached: 9389356 kB
SwapCached: 212 kB
Active: 6569200 kB
Inactive: 3725364 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 16425996 kB
LowFree: 5698808 kB
SwapTotal: 8273464 kB
SwapFree: 8273252 kB
Dirty: 980 kB
Writeback: 0 kB
AnonPages: 524108 kB
Mapped: 24568 kB
Slab: 381776 kB
PageTables: 7496 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 16486460 kB
Committed_AS: 2143856 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 267656 kB
VmallocChunk: 34359469303 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB

free命令里各项内存指标说明:

total used free shared buffers cached
Mem: 16425996 10727220 5698776 0 380904 9389832
-/+ buffers/cache: 956484 15469512
Swap: 8273464 212 8273252

其中第一行用全局角度描述系统使用的内存状况:
total——总物理内存
used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
free——完全未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached——缓存,用于已打开的文件
总结:
total=used+free
used=buffers+cached (maybe add shared also)

第二行描述应用程序的内存使用:
前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
总结: 
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cached

第三行表示swap的使用:
used——已使用
free——未使用

什么是Cache Memory(缓存内存):
当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。

其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory也是有办法的。

如何释放Cache Memory(缓存内存):

用下面的命令可以释放Cache Memory:

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

注意,释放前最好sync一下,防止丢失数据。

总结:个人经验认为没必要手动释放,这种内存管理方式也是比win优胜的地方之一!因为Linux的内核内存管理机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以提高文件以及磁盘的读写速度。

2、page cache

page cache是一种策略,就是使用完的page并不是立即放到内核的 

free page list中,而是暂时缓存着已被再次使用。这样系统中的 
缓冲的page就越来越多,系统中的free page就越来越少,怎么办? 
系统通过内核线程来完成缓存中页面的回收工作,这些内核线程是 
定期被调用的,平时则处在睡眠的状态,如果进程需要page而free 
page严重短缺的时候,进程可以唤醒这些内核线程来回收缓存的页面, 
这样,一方面缓存,一方面回收达到一种平衡,同时改善了系统的性能。 
 内核中在多处使用了page cache策略,最典型的有:页面交换,和磁盘 
文件的读取。不过实现的方法无非是让不同状态的page,处在不同的 
list中,而回收的内核线程从可以回收的队列中回收page。

3、swap cache

swap cache主要是存放那些无根(就是说没有文件系统中的某个文件和其 
对应)的page,例如你用malloc分配出来的。 
它对应的file device就是swapfile。 
它和page cache的区别在于,当文件从file system上读取出来的时候, 
它的内容就会同时读入page cache中。但是当你用malloc分配内存的 
时候,并不马上放到swap cache中,而是在进程中不再使用该内存的 
时候它才被读入swap cache中。 
buffer cache和page cache在2.4 内核里面几乎么啥大区别,我们完全 
可以通过对page cache的操作来实现把数据写入到disk中,而不一定要 
通过buffer cache。如果要说区别的话,主要是page cache的大小是固定 
的,如果你是要从软盘设备(它的block大小是512字节),就可以用一页 
来保存好几个block。这样buffer cache可以同时拥有连续的好几页page cache 

中的page。


这个swap cache的作用不是说要加快磁盘的I/O效率,主要是为了防止页面在swap in和swap out时,进程的同步问题,也就是在进行swap out操作时(将页面内容写入磁盘分区时)进程如果发起了对换出页面的访问,系统对其的处理。有了swap cache的存在,如果页面的数据还没有完全写入磁盘时,这个page frame是在swap cache(swap cache有个引用指向页面),等数据完全写入磁盘后,而且没有进程对page frame进行访问,那么swap cache才会释放page frame,将其交给buddy system.

0 0
原创粉丝点击