Linux Cache
bruce
目录
Cache
Buffer
Page cache
Buffer cache
Free命令解析
$ free
total used free shared buffers cached
Mem: 8177520 8115396 62124 0 77236 6695484
-/+ buffers/cache: 1342676 6834844
Swap: 2104504 338472 1766032
total=used+free 8177520=8115396+62124
1342676+6834844
used=buffers+cached (maybe add shared also)
8115396 =6695484+77236
Cached+buffers+free 683484=6695484+77236+62124
used-buffer-cache 1342676=8115396-6772720
$ cat /proc/meminfo
MemTotal: 8177520 kB 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)
MemFree: 97000 kB LowFree与HighFree的总和,被系统留着未使用的内存
Buffers: 75928 kB 用来给文件做缓冲大小
Cached: 6660532 kB 被高速缓冲存储器(cache memory)用的内存的大小(等于 diskcache minus SwapCache ).
SwapCached: 3108 kB 被高速缓冲存储器(cache memory)用的交换空间的大小已经被交换出来的内存,但仍 然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。
Active: 5067652 kB 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用.
Inactive: 2726092 kB 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径.
HighTotal: 0 kB 高区内存总数,该区域不是直接映射到内核空间。内核必须使用不同的手法使用该段内存
HighFree: 0 kB
LowTotal: 8177520 kB
LowFree: 97000 kB 低位可被内核直接映射到,而且它还能够被内核用来记录一些自己的数据结构。
SwapTotal: 2104504 kB 交换空间的总大小
SwapFree: 1766132 kB 未被使用交换空间的大小
Dirty: 224724 kB 等待被写回到磁盘的内存大小。
Writeback: 0 kB 正在被写回到磁盘的内存大小.
AnonPages: 1052592 kB 未映射页的内存大小
Mapped: 369524 kB 设备和文件等映射的大小。
Slab: 246016 kB 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。
CommitLimit: 6193264 kB 内存过量使用值,
Committed_AS: 11397336 kB 目前的分配给系统的内存量
PageTables: 9528 kB 管理内存分页页面的索引表的大小。
VmallocTotal: 34359738367 kB 可以vmalloc虚拟内存大小
VmallocUsed: 1620 kB 已经被使用的虚拟内存大小
VmallocChunk: 34359736691 kB 最大连续的可用的虚拟内存大小
HugePages_Total: 0 Hugepage的页面数量 larger page的支持。这个参数可能在Oracle调优时用到。
HugePages_Free: 0 剩余的页面数量 cat /proc/sys/vm/nr_hugepages
HugePages_Rsvd: 0 被分配预留但是还没有使用的page数目
Hugepagesize: 2048 Kb 每单位数量大小
cache
Cache
定义
高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。存储器的高速缓冲存储器存储了频繁访问的 RAM 位置的内容及这些数据项的存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。因为高速缓冲存储器总是比主RAM 存储器速度快,所以当 RAM 的访问速度低于微处理器的速度时,常使用高速缓冲存储器
Buffer
定义 与cacahe类似,但更多偏软件。从文件读写角度看buffer cache缓存文件系统的管理信息像root entry(根目录), inode(stat命令)等,而page cache缓存文件的内容。
Buffer和cache二者并不是相互排斥的,而更多的是互相作用的。
不过,有些不同。Buffer是一块临时内存空间,一般来说,由于cpu指令不能直接处理外设上的数据,而可标记位置的内存就被用来作为两者的桥梁。Buffer被合理利用于当一个大块数据被组合或分解(存储设备的要求),或者当数据交换时和他产生时不一致。多数情况下,整个buffer的数据经常按顺利传输(比如往硬盘里),所以buffer自身有时候会提高传输性能,或者减少变更或者传输延时的抖动。相对于缓存,意图是为了减少延迟。这对于即使一次从buffer里读一次或者写一次都是有好处的。Cache经常增加传输性能。一部分的提高同样来自多个小的传输合并为一次大的块传输。但他最大的性能提升源于相同一块内容会被多次读取,或者写数据会比读书节快。cache的唯一目的是为了减少对底层速度较慢存储的访问。cache也通常是一个抽象层的设计是从邻近层的角度看不到的。
Cache与Buffer
Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。
The difference between buffer and cache
Buffer和cache二者并不是相互排斥的,而更多的是互相作用的。不过,有些不同。
Buffer是一块临时内存空间,一般来说,由于cpu指令不能直接处理外设上的数据,而可标记位置的内存就被用来作为两者的桥梁。Buffer被合理利用于当一个大块数据被组合或分解(存储设备的要求),或者当数据交换时和他产生时不一致。多数情况下,整个buffer的数据经常按顺利传输(比如往硬盘里),所以buffer自身有时候会提高传输性能,或者减少变更或者传输延时的抖动。相对于缓存,意图是为了减少延迟。这对于即使一次从buffer里读一次或者写一次都是有好处的。
Cache经常增加传输性能。一部分的提高同样来自多个小的传输合并为一次大的块传输。
但他最大的性能提升源于相同一块内容会被多次读取,或者写数据会比读书节快。cache的唯一目的是为了减少对底层速度较慢存储的访问。cache也通常是一个抽象层的设计是从邻近层的角度看不到的。
Buffer cache
定义
buffer cache,又称bcache,其中文名称为缓冲器高速缓冲存储器,简称缓冲器高缓。另外,buffer cache按照其工作原理,又被称为块高缓。
定义 与cacahe类似,但更多偏软件,前者更多偏向硬件。从文件读写角度看buffer cache缓存文件系统的管理信息像root entry(根目录), inode(stat命令)等,而page cache缓存文件的内容。
Buffer Cache
由于bcache位于物理文件系统和块设备驱动程序之间,因此,当物理文件系统需要从块设备上读取数据时,它首先试图从bcache中去读。如果命中,则内核就不必在去访问慢速的块设备。否则如果命中失败,也即数据不在bcache中,则内核从块设备上读取相应的数据块,并将其在bcache中缓存起来,以备下次访问之用。
Page cache
定义
page cache,又称pcache,其中文名称为页高速缓冲存储器,简称页高缓。page cache的大小为一页,通常为4K(getconf PAGE_SIZE)。可通过getconf PAGE_SIZE得到其大小。在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问.
内存管理系统和VFS与page cache交互,内存管理系统负责维护每项page cache的分配和回收,同时在使用memory map方式访问时负责建立映射;VFS负责page cache与用户空间的数据交换。
$ getconf PAGE_SIZE
4096
Page与buffe_head关系
内存管理系统和VFS与page cache交互,内存管理系统负责维护每项page cache的分配和回收,同时在使用memory map方式访问时负责建立映射;VFS负责page cache与用户空间的数据交换。
在Linux内核中,文件的每个数据块最多只能对应一个page cache项,它通过两个数据结构来管理这些cache项,一个是radix tree,另一个是双向链表。
Radix tree是一种搜索树,Linux内核利用这个数据结构,快速查找脏的(dirty)和回写的(writeback)页面,得到其文件内偏移,从而对page cache进行快速定位。
下图是radix tree的一个示意图,该radix tree的分叉为4(22),树高为4,用来快速定位8位文件内偏移。Linux(2.6.7) 内核中的分叉为 64(26),树高为 6(64位系统)或者 11(32位系统),用来快速定位 32 位或者 64 位偏移。radix tree 中的每一个叶子节点指向文件内相应偏移所对应的Cache项。
另一个数据结构是双向链表,Linux内核为每一片物理内存区域(zone)维护active_list和 inactive_list两个双向链表,这两个list主要用来实现物理内存的回收。这两个链表上除了文件Cache之外,还包括其它匿名 (Anonymous)内存,如进程堆栈等
Read/write/sendfile等API实现
Memory map请求页机制
首先,应用程序调用mmap(图中1),陷入到内核中后调用do_mmap_pgoff(图中2)。该函数从应用程序的地址空间中分配一段区域作为映射的内存地址,并使用一个VMA(vm_area_struct)结构代表该区域,之后就返回到应用程序(图中3)。当应用程序访问mmap所返回的地址指针时(图中4),由于虚实映射尚未建立,会触发缺页中断(图中5)。之后系统会调用缺页中断处理函数(图中6),在缺页中断处理函数中,内核通过相应区域的 VMA结构判断出该区域属于文件映射,于是调用具体文件系统的接口读入相应的Page Cache项(图中7、8、9),并填写相应的虚实映射表。经过这些步骤之后,应用程序就可以正常访问相应的内存区域了。
内核回收线程kswap和try_to_free_page()内核函数被用来负责页的回收
$ ps axu|grep kswapd|grep -v 'grep'
root 261 0.0 0.0 0 0 ? S 2010 31:43 [kswapd0]
Ext3日志线程:
$ ps axu|grep journal
root 620 0.0 0.0 0 0 ? S 2010 12:37 [kjournald]
root 1405 0.0 0.0 0 0 ? S 2010 38:48 [kjournald]
root 1407 0.0 0.0 0 0 ? S 2010 178:07 [kjournald]
查看/proc/kcore文件的大小(内存镜像):
[root@scs-2 tmp]# ll -h /proc/kcore
-r-------- 1 root root 4.1G Jun 12 12:04 /proc/kcore
查看dirty buffers阀值
cat /proc/sys/vm/dirty_background_ratio
刷新和释放缓存
刷新缓存:
Man Sync :
Force changed blocks to disk, update the super block.
To free pagecache, use
echo 1 > /proc/sys/vm/drop_caches;
To free dentries and inodes, use
echo 2 > /proc/sys/vm/drop_caches;
To free pagecache, dentries and inodes, use
echo 3 > /proc/sys/vm/drop_caches.
1) /proc/sys/vm/block_dump
该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作。
缺省设置:0,禁用Block Debug模式
2) /proc/sys/vm/dirty_background_ratio
该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘。
缺省设置:10
3) /proc/sys/vm/dirty_expire_centisecs
该文件表示如果脏数据在内存中驻留时间超过该值,pdflush进程在下一次将把这些数据写回磁盘。
缺省设置:3000(1/100秒)
4) /proc/sys/vm/dirty_ratio
该文件表示如果进程产生的脏数据到达系统整体内存的百分比,此时进程自行把脏数据写回磁盘。
缺省设置:40
5) /proc/sys/vm/dirty_writeback_centisecs
该文件表示pdflush进程周期性间隔多久把脏数据写回磁盘。
缺省设置:500(1/100秒)
6) /proc/sys/vm/vfs_cache_pressure
该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。
缺省设置:100
7) /proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。
8) /proc/sys/vm/nr_pdflush_threads
该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。
缺省设置:2(只读)
9) /proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。
缺省设置:0
10) /proc/sys/vm/overcommit_ratio
该文件表示,如果overcommit_memory=2,可以过载内存的百分比,通过以下公式来计算系统整体可用内存。
系统可分配内存=交换空间+物理内存*overcommit_ratio/100
缺省设置:50(%)
11) /proc/sys/vm/page-cluster
该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。
缺省设置:3(2的3次方,8页)
12) /proc/sys/vm/swapiness
该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。
缺省设置:60
13) legacy_va_layout
该文件表示是否使用最新的32位共享内存mmap()系统调用,Linux支持的共享内存分配方式包括mmap(),Posix,System VIPC。
0,使用最新32位mmap()系统调用。
1,使用2.4内核提供的系统调用。
缺省设置:0
14) nr_hugepages
该文件表示系统保留的hugetlb页数。
15) hugetlb_shm_group
该文件表示允许使用hugetlb页创建System VIPC共享内存段的系统组ID。
http://hi.baidu.com/imlidapeng/blog/item/4ac8a80a6c798d286a60fb65.html
http://hi.baidu.com/imlidapeng/home
http://www.ibm.com/developerworks/cn/linux/l-cache/index.html
本文原创自无线技术运营空间: http://wireless.qzone.qq.com 及 http://blog.csdn.net/wireless_tech (专注无线技术运营——无线技术(操作系统/数据库/WEB前端/负载均衡/系统容灾/系统安全/短信接入/WAP接入/3G等)、无线业务运营、无线开放平台、统计分析(用户行为分析/数据挖掘)、CP合作,联系我们:[email protected])