关于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
建议继续学习:
- 海量小文件存储 (阅读:7540)
- 其实,文件也可以truncate (阅读:7382)
- Buffer和cache的区别是什么? (阅读:6823)
- 谈冷热数据 (阅读:5732)
- Linux操作系统中内存buffer和cache的区别 (阅读:5305)
- 学习:一个并发的Cache (阅读:4968)
- Twitter架构图(cache篇) (阅读:4719)
- Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (阅读:4426)
- 修改系统最大文件句柄数 (阅读:4259)
- 详解MyISAM Key Cache(前篇) (阅读:4064)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:phpor 来源: PHPor 的Blog
- 标签: cache 文件
- 发布时间:2009-11-20 20:57:50
- [65] Oracle MTS模式下 进程地址与会话信
- [64] Go Reflect 性能
- [64] 如何拿下简短的域名
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [58] 图书馆的世界纪录
- [56] android 开发入门
- [53] 视觉调整-设计师 vs. 逻辑
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [45] 界面设计速成