利用posix_fadvise清理系统中的文件缓存
2012-08-24 20:49
323 查看
利用posix_fadvise清理系统中的文件缓存
leoncom
c/c++,unix2011-08-03
当我们需要对某段读写文件并进行处理的程序进行性能测试时,文件会被系统cache住从而影响I/O的效率,必须清理cache中的对应文件的才能正确的进行性能测试。通常清理内存可以采用下面的这条命令,但这条命令只有root才能使用,另外一方面这个会清理所有的cache,也许会影响其他程序的性能。
echo 3>/proc/sys/vm/drop_caches
linux下有一个posix_fadvise函数可以用来对cache中的文件进行清理,有关posix_fadvise的详细说明查看man手册。
view plaincopy to clipboardprint?
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
”Programs can use posix_fadvise to announce an intention to access file data in a specific pattern in the future, thus allowing the kernel to perform appropriate optimisations”
fd是文件的描述符,用于清理对应文件cache的advice值选取POSIX_FADV_DONTNEED,利用此函数编写下面程序进行文件的清理。
view plaincopy to clipboardprint?
int clear_file_cache(const char *filename)
{
struct stat st;
if(stat(filename , &st) < 0) {
fprintf(stderr , "stat localfile failed, path:%s\n",filename);
return -1;
}
int fd = open(filename, O_RDONLY);
if( fd < 0 ) {
fprintf(stderr , "open localfile failed, path:%s\n",filename);
return -1;
}
//clear cache by posix_fadvise
if( posix_fadvise(fd,0,st.st_size,POSIX_FADV_DONTNEED) != 0) {
printf("Cache FADV_DONTNEED failed, %s\n",strerror(errno));
}
else {
printf("Cache FADV_DONTNEED done\n");
}
return 0;
}
此外,linux-ftools这个工具也可以帮助清理并查看文件的内存状态,主页上也有详细的使用说明。编译后我们利用fincore这个工具来查看文件在内存中的状态,有关fincore的实现可以在linux下man mincore,mincore是根据缓存buffer指针来其指向的缓冲区判断在cache中的状态,fincore就是在mincore的基础上直接操作文件,就是通过对文件mmap获得指针,再调用mincore来判断。
首先我们通过cp命令拷贝了一个相对有点容量的文件,然后利用fincore查看文件在内存中的cache情况,可以看到大概cache了99.55%。
接着执行上面那段代码的运行程序,之后再执行命令查看该文件的缓存状态
可以看到,该文件在内存中已经没有被cache了。实际的清理效果也可以通过一些占用I/O的读文件程序来测试,一般程序第二遍运行时候由于文件已经被cache,实际程序运行的速度会比较快,通过上面的posix_fadivse清理之后,又会恢复和第一遍差不多的时间。
leoncom
c/c++,unix2011-08-03
当我们需要对某段读写文件并进行处理的程序进行性能测试时,文件会被系统cache住从而影响I/O的效率,必须清理cache中的对应文件的才能正确的进行性能测试。通常清理内存可以采用下面的这条命令,但这条命令只有root才能使用,另外一方面这个会清理所有的cache,也许会影响其他程序的性能。
echo 3>/proc/sys/vm/drop_caches
linux下有一个posix_fadvise函数可以用来对cache中的文件进行清理,有关posix_fadvise的详细说明查看man手册。
view plaincopy to clipboardprint?
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
”Programs can use posix_fadvise to announce an intention to access file data in a specific pattern in the future, thus allowing the kernel to perform appropriate optimisations”
fd是文件的描述符,用于清理对应文件cache的advice值选取POSIX_FADV_DONTNEED,利用此函数编写下面程序进行文件的清理。
view plaincopy to clipboardprint?
int clear_file_cache(const char *filename)
{
struct stat st;
if(stat(filename , &st) < 0) {
fprintf(stderr , "stat localfile failed, path:%s\n",filename);
return -1;
}
int fd = open(filename, O_RDONLY);
if( fd < 0 ) {
fprintf(stderr , "open localfile failed, path:%s\n",filename);
return -1;
}
//clear cache by posix_fadvise
if( posix_fadvise(fd,0,st.st_size,POSIX_FADV_DONTNEED) != 0) {
printf("Cache FADV_DONTNEED failed, %s\n",strerror(errno));
}
else {
printf("Cache FADV_DONTNEED done\n");
}
return 0;
}
此外,linux-ftools这个工具也可以帮助清理并查看文件的内存状态,主页上也有详细的使用说明。编译后我们利用fincore这个工具来查看文件在内存中的状态,有关fincore的实现可以在linux下man mincore,mincore是根据缓存buffer指针来其指向的缓冲区判断在cache中的状态,fincore就是在mincore的基础上直接操作文件,就是通过对文件mmap获得指针,再调用mincore来判断。
首先我们通过cp命令拷贝了一个相对有点容量的文件,然后利用fincore查看文件在内存中的cache情况,可以看到大概cache了99.55%。
接着执行上面那段代码的运行程序,之后再执行命令查看该文件的缓存状态
可以看到,该文件在内存中已经没有被cache了。实际的清理效果也可以通过一些占用I/O的读文件程序来测试,一般程序第二遍运行时候由于文件已经被cache,实际程序运行的速度会比较快,通过上面的posix_fadivse清理之后,又会恢复和第一遍差不多的时间。
相关文章推荐
- ceph存储 利用posix_fadvise清理系统中的文件缓存
- 利用posix_fadvise清理系统中的文件缓存
- 利用posix_fadvise清理系统中的文件缓存
- 利用posix_fadvise清理系统中的文件缓存
- linux c 清理系统文件缓存—— posix_fadvise
- win7清理系统缓存,复制到一个文件,把文件后缀为.bat
- 清理系统文件缓存
- 【NAS】客户端NFS文件系统的缓存IO机制
- 系统缓存学习(五)文件缓存依赖
- 清理Ubuntu系统的缓存、垃圾、多余内核。
- django开发中利用 缓存文件 进行页面缓存
- AIX卷管理介绍以及利用空闲PP来创建文件系统
- 嵌入式Linux-根文件系统2_(利用交叉编译工具链,构建/lib目录)
- 如何快速清理Mac系统上的大额文件
- 系统加速批处理文件:清理无用共享、内存及系统垃圾
- 利用ReentrantReadWriteLock实现缓存系统
- 利用RMAN将数据库从文件系统迁移到ASM
- 利用nandsim挂载ubi文件系统
- 再论怎么有效利用浏览器缓存之------怎么避免浏览器缓存静态文件
- Step1数据系统技术(5.使用GZIP技术优化文件缓存)