关于Linux的文件系统cache

关于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

区别:

        

  1. /dev/mem: 物理内存的全镜像。可以用来访问物理内存。
  2.     

  3. /dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。

作用:

        

  1. 前者用来访问物理IO设备,比如X用来访问显卡的物理内存,或嵌入式中访问GPIO。用法一般就是open,然后mmap,接着可以使用map之后的地址来访问物理内存。这其实就是实现用户空间驱动的一种方法。
  2.     

  3. 后者一般可以用来查看kernel的变量,或者用作rootkit之类的。参考1和2描述了用来查看kernel变量这个问题。

参考:

        

  1. http://lwn.net/Articles/147902/
  2.     

  3. http://lkml.org/lkml/2005/8/11/301

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据