`

linux中的buffer和cache

 
阅读更多

free命令大家都经常使用,

taotaoma@tma-laptop1:~/kernel/linux-2.6$ free
total       used       free     shared    buffers     cached
Mem:       5918476    1675260    4243216          0     157664     819004
-/+ buffers/cache:     698592    5219884
Swap:            0          0          0

    各个内容的显示应该还算是简单明了的,唯一比较让人困惑的两项就是buffers和cached。一般的认识都是说buffers指的是元数据的数量,而cached是指文件的page cache的数量。那么真的是这样么?

    其实现在的linux内核中对于缓存的管理都是以page的形式进行的,也就是说在系统底层只存在各种page,这些page保存在不同的tree 中,buffer这个概念实际上已经过时了,但是为了保持对过往系统的兼容性,linux内核中还保留了这个概念,并仍然用它来代表文件系统中的一些所谓的元数据,但是由于已经没有buffer了,那么free该怎么显示buffers呢?内核巧妙的利用了一个特性,那就是文件系统在读取元数据的时候一般都是通过它所对应的块设备来进行,也就是说元数据存储的page一般都是保存在块设备对应的tree中,而一般文件的page  cache则是保存在它的宿主文件的tree中。有了这个假设,我们就可以通过统计所有在块设备的tree上的page来得出系统的buffers数量。

    这一块对应的代码是这样的(以2.6.32的代码为例):

    free是通过读取/proc/meminfo里面的数据来显示的,而/proc/meminfo的具体实现代码在Linux内核中的fs/proc/meminfo.c里面。

    sysinfo.bufferram是通过函数si_meminfo得到的,查看si_memeinfo可以看到这样一行:

val->bufferram = nr_blockdev_pages();

    而对应的函数就很简单了

long nr_blockdev_pages(void)
{
    struct block_device *bdev;
    long ret = 0;
    spin_lock(&bdev_lock);
    list_for_each_entry(bdev, &all_bdevs, bd_list) {
        ret += bdev->bd_inode->i_mapping->nrpages;

    }
    spin_unlock(&bdev_lock);
    return ret;
}

    遍历所有的块设备,然后把所有的块设备tree上的pages数目加起来,然后返回,是不是一目了然呢!

    问题到这里真的就结束了么?非也非也,这样的算法明显很不精确,因为如果我直接操作裸设备,那内核如何区分呢?大家可以做一个简单的测试。

echo 3 > /proc/sys/vm/drop_caches

free

dd if=/dev/sda of=/dev/null bs=1M count=1000

free (buffer的数量增加了1000M)

    相信大家一定都看到了buffers的剧烈增长了吧!由于你像文件系统一样直接通过块设备来读取设备的内容,所以内核把你这次操作读取的page都算作了buffers,也就从侧面验证了free命令中计算buffers所用的算法。

 

写数据到文件系统的文件中:

echo 3 > /proc/sys/vm/drop_caches

dd if=/dev/zero of=200Mfile bs=100M count=2

free (cache的数量增加了200M, buffer几乎不变)

 

读文件系统的文件

echo 3 > /proc/sys/vm/drop_caches

if=14GB_largefile of=/dev/null bs=200M count=2

free (cached增加了13G多,buffers增加了10M左右)

 

结论:文件系统中的文件读写 对 caches消耗的影响很大。

而裸设备对

分享到:
评论

相关推荐

    linux内存中buffer与cache的区别

    我们通过free命令查看机器空闲内存时,会发现free的值很...这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

    Oracle Buffer和Cache的区别

    Oracle Buffer和Cache的区别 buffer与cache操作的对象就不一样。 buffer(缓冲)是为了提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的。 cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计...

    Linux内存buffer和cache的区别

    在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得...

    Linux操作系统中内存buffer和cache的区别.docx

    Linux操作系统中内存buffer和cache的区别.docx

    Linux操作系统中内存buffer和cache的区别.pdf

    Linux操作系统中内存buffer和cache的区别.pdf

    Linux内存中Swap和Buffer Cache机制

    Linux的产生与发展,更多的应用与服务器,那么对于Linux的各个管理机制要非常清 楚,一个完整的Linux系统主要有存储管理,内存管理,文件系统和进程管理等几...本文将为大家介绍Linux内存中Swap和Buffer Cache机制。

    解决 linux 下 buffcache 占用过高的问题.docx

    解决 linux下 buff/cache 占用过高的问题解决 linux下 buff/cache 占用过高的问题

    Performance Analysis of the Linux Buffer Cache While Running an Oracle OLTP Workload

    Performance Analysis of the Linux Buffer Cache While Running an Oracle OLTP Workload

    实用全面的linux教程大全

    Linux操作系统中内存buffer和cache的区别.docx Linux服务器环境搭建(设置).pdf linux简明维护手册.pdf Linux系统命令及其使用详解.doc Linux系统性能监控工具.doc Linux系统整体性能监控工具详解.doc nmon on Linux ...

    边干边学——LINUX内核指导

    第1章 了解Linux内核 1. 1 Linux内核 1. 2 查看Linux内核状况 1. 3 编程序检查系统状况 1. 4 Linux编程环境 ...11. 6 buffer cache 11. 7 实验:添加一个文件系统 11. 8 附录:优秀的日志文件系统--ext3

    容器缓存查看利器hcache的使用

    查询缓存使用命令hcache,已经是二进制的了,上传可以使用

    Linux操作系统的内存使用机制研究

    Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。...这叫作磁盘缓冲(Disk Buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。

    Linux-0.11 [内核源代码带中文注释]

    buffer cache as in minix ! ! The loader has been made as simple as possible, and continuos ! read errors will result in a unbreakable loop. Reboot by hand. It ! loads pretty fast by getting whole ...

    简单了解Linux性能监控命令free

    在系统遇到各种IO瓶颈,内存使用率高,cpu使用率高等问题时,我们如何来定位错误?linux提供了很多命令来协助我们快速定位到错误,free命令是Linux最...要完全理解上面3行数据,先搞明白buffer和cache是什么。 buffe

    ARM_Linux启动分析.pdf

    在arch/alpha/vmlinux.lds 的链接脚本控制下,链接程序将vmlinux的入口置于 "arch/alpha/kernel/head.S"中的__start上,因此当Bootloader跳转到0x100000时, __start处的代码开始执行。__start的代码很简单,只需要...

    understanding linux network internals

    The Socket Buffer: sk_buff Structure 套接字缓存:sk_buff结构 Section 2.2. net_device Structure net_device结构 Section 2.3. Files Mentioned in This Chapter 本章所涉及的到的(代码)文件 Chapter 3. User...

    weblogic平台J2EE调优策略

    1.1.4 尽量使用pool,buffer和cache 1.2 JDBC代码调优 1.2.1 严格资源使用 1.2.2 实用技巧 1.2.3 优化SQL语句 1.3 Web代码调优 1.3.1 HttpSession的使用 1.3.2 JSP代码调优 1.3.3 Servlet代码调优 1.4 JMS代码调优 ...

    Wrox.Professional.Linux.Kernel.Architecture.

    Chapter 16: Page and Buffer Cache949 Chapter 17: Data Synchronization . 989 Chapter 18: Page Reclaim and Swapping. 1023 Chapter 19: Auditing 1097 Appendix A: Architecture Specifics . 1117 Appendix B:...

    php资料库4 防止foeach中变量不是数组

    MySQL优化经验 key_buffer_size,query_cache_size,table_cache.txt bbscon.mht mysql SHOW STATUS 详解_病毒的BLOG_新浪博客.mht MYSQL系统优化与系统设置参数的一次调查-(2)_Linux技术文章_Linux_操作系统.mht ...

    入门学习Linux常用必会60个命令实例详解doc/txt

    halt执行时,杀死应用进程,执行sync(将存于buffer中的资料强制写入硬盘中)系统调用,文件系统写操作完成后就会停止内核。若系统的运行级别为0或6,则关闭系统;否则以shutdown指令(加上-h参数)来取代。  ...

Global site tag (gtag.js) - Google Analytics