IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

关于Linux的文件系统cache

PHPor 的Blog 2009-11-20 20:57:50 累计浏览 5,916 次
本机暂存
关于linux中系统cache的测试:

    当我们第一次访问某文件(或其中的一部分时),速度是比较慢的,但是再次访问就很快了,下面我们通过一个程序做一下冷热数据的访问速度的比较。  

以下是代码片段:
    $fp = fopen($argv[1], "r"); 
    echo microtime(); 
    $offset = isset($argv[2])?$argv[2]:0; 
    fseek($fp,$offset); 
    $content = fread($fp,4096); 
    echo "\n"; 
    echo microtime(); 
    echo "\n"; 
    fclose($fp);
    ?>

    -----------------------------

    测试结果:

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm

    0.49064700 1258509003

    0.49845600 1258509003

    // 第一次访问耗时约8ms

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm

    0.04973400 1258509015

    0.04988900 1258509015

    // 第二次访问相同的数据,耗时约1.5ms

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm

    0.50933300 1258509019

    0.50948600 1258509019

    // 第二次访问相同的数据,耗时约1.5ms

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm 10

    0.63028200 1258509035

    0.63044500 1258509035

    // 访问和上次稍有差异的数据,耗时约0.2ms,

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm 4096

    0.89414900 1258509055

    0.89434800 1258509055

    // 访问和上次差异4k的数据,耗时约0.2ms

    // 说明第一次系统缓存起来的数据不仅仅是我们访问的4k的数据,而是更多,具体多少,看内核源代码吧,似乎比测试更快、更准确一些

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm 4096000

    0.24825000 1258509072

    0.25472600 1258509072

    // 访问和原来差异4M的数据,耗时6ms,说明这部分数据没有被系统cache给缓存

    [junjie2@bsso ~]$ mv MySQL-devel-community-5.1.40-0.rhel5.i386.rpm MySQL-devel-community-5.1.40-0.rhel5.i386.rpm2

    [junjie2@bsso ~]$ php cache.php MySQL-devel-community-5.1.40-0.rhel5.i386.rpm2 4096000            

    0.54055900 1258510429

    0.54070300 1258510429

    // 重命名文件后访问相同内容,耗时约0.2ms

    // 说明文件重命名不影响系统cache,即系统cache和文件名没有关系; 大概是根据inode来cache的,因为重命名前后的inode是没有变化的,name仅仅是文件的一个属性罢了

    [junjie2@bsso ~]$

    遗留问题:

    1. 系统cache的换出机制是怎样的?

    2. 系统cache的具体内容能查看吗? 肯定能的,怎么查看呢?

    3. 如何刷新系统cache? 上面的测试说明,至少重命名文件是不行的;

    另外:

    系统cache是系统级别的cache,和进程没有关系; 如mysqld因系统cache加快了访问的速度,这时,重启mysqld是没用的。

    参考:

    文件系统的cache可以通过/dev/mem 这个字符设备来查看,好像系统利用缓存时是根据inode来查询的,就像memcached那样,至少现在要枚举所有信息是比较麻烦的。

    /dev/mem  与 /dev/kmem 的区别:

    原创内容,转载请标明来自http://lixings.cublog.cn

    区别:

     /dev/mem: 物理内存的全镜像。可以用来访问物理内存。    /dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。作用:

     前者用来访问物理IO设备,比如X用来访问显卡的物理内存,或嵌入式中访问GPIO。用法一般就是open,然后mmap,接着可以使用map之后的地址来访问物理内存。这其实就是实现用户空间驱动的一种方法。    后者一般可以用来查看kernel的变量,或者用作rootkit之类的。参考1和2描述了用来查看kernel变量这个问题。参考:

     http://lwn.net/Articles/147902/    http://lkml.org/lkml/2005/8/11/301

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,308)
  2. 我的 RHCA 之路 (累计阅读 14,013)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,230)
  4. 给程序员新手的一些建议 (累计阅读 13,089)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  6. 关于linux内存free的一些事情 (累计阅读 12,867)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,688)
  8. Google怎么用linux (累计阅读 12,581)
  9. Linux Used内存到底哪里去了? (累计阅读 11,867)
  10. find命令的一点注意事项 (累计阅读 11,865)