linux php缓存文件,关于Linux的文件系统cache

本文通过PHP脚本展示了Linux系统缓存对文件访问速度的影响。首次访问文件时速度较慢,随后的访问显著加快,表明系统缓存了文件内容。测试揭示,即使文件重命名,已缓存数据仍可快速访问,说明缓存与文件名无关,可能基于inode。此外,文章提出了系统缓存的换出机制、查看缓存内容的方法以及如何刷新缓存等问题。
摘要由CSDN通过智能技术生成

关于linux中系统cache的测试:

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

----------测试脚本------------

$fp =fopen($argv[1],"r");

echomicrotime();$offset= isset($argv[2])?$argv[2]:0;fseek($fp,$offset);$content=fread($fp,4096);

echo"\n";

echomicrotime();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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值