释放Linux操作系统文件缓存
2014-01-22 08:27
323 查看
释放Linux操作系统文件缓存
转自:http://pthread.blog.163.com/blog/static/1693081782011111402639863/
自从工作了,再也没有更新过这个技术博客。一来工作了没什么好写的,二来确实也挺忙。最近稍微有点空闲,先开一个写一点吧。记得在公司做新人习题的时候,题目是通过网络和本地分别读取一个约12G的大文件,从中读取每一行,对每行特定的几个字段,调用分词库分词并统计词频。当时遇到一个很郁闷的事情就是,12G的文件读取一次了之后,系统中有缓存;然后第二次再次运行的时候,因为有缓存的影响,性能差异挺大(本地读取几乎三倍性能差距)。但是当时的开发机器上,自己只有普通用户权限,无法通过修改/proc/sys/vm/drop_cache来达到目的。所以最后还是没有搞定这个问题。
后来发现Linux的一个系统调用:
#include <fcntl.h>
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
有一个选项POSIX_FADV_DONTNEED可以做这件事情。网上找了下好像挺多人也遇到这个无问题的,所以就把我的解决办法放到这里。于是写了一个小工具,一次批量清除文件在系统中的缓存。
#define _FILE_OFFSET_BITS 64 #define __USE_XOPEN2K #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <getopt.h> const struct option dcache_options[] = { {"sync",0,NULL,'s'}, {"help",0,NULL,'h'}, {NULL,0,NULL,0} }; void usage(char* proc_name,int exit_code) { printf("dcache is an utility to drop file cache.\n" "usage:%s [-s] file\n" "\t-s,--sync, sync data before drop cache.\n" "\t-h,--help, print help.\n",proc_name); exit(exit_code); } int dcache(int fd, int sync_data) { off_t off,len; struct stat buf; int save_errno; save_errno = errno; if (sync_data) { if (fsync(fd) < 0) { printf("%s\n",strerror(errno)); errno = save_errno; return -1; } } if (fstat(fd,&buf) < 0) { printf("%s\n",strerror(errno)); errno = save_errno; return -1; } off = 0; len = buf.st_size; if (posix_fadvise(fd,off,len,POSIX_FADV_DONTNEED) < 0) { printf("%s\n",strerror(errno)); errno = save_errno; return -1; } return 0; } int main(int argc, char* argv[]) { int c,fd; char* file; int long_index = 0; int print_help = 0; int sync_data = 0; while ((c = getopt_long(argc,argv,"sh",dcache_options,&long_index)) != -1) { switch (c) { case 's': sync_data = 1; break; case 'h': print_help = 1; break; default: printf("unknown option -%c\n",c); usage(argv[0],EXIT_FAILURE); break; } } if (print_help) { usage(argv[0],EXIT_SUCCESS); } if (optind >= argc) { printf("file name required\n"); exit(EXIT_FAILURE); } for (c = optind; c < argc; ++c) { file = argv[c]; if ((fd = open(file,O_RDWR)) < 0) { printf("open %s failed.\n",file); } else { printf("drop cache of %s %s.\n",file,dcache(fd,sync_data) == 0?"success":"failed"); close(fd); } } exit(EXIT_SUCCESS); }
使用方法:
dcache -h
dcache is an utility to drop file cache.
usage:dcache [-s] file
-s,--sync, sync data before drop cache.
-h,--help, print help.
--sync选项用于将数据写回硬盘。因为man posix_fadvise说了:
POSIX_FADV_DONTNEED attempts to free cached pages associated with the specified region. This is useful, for example, whilestreaming large files. A program may periodically request the kernel to free cached data that
has already been used, so that more useful cached pages are not discarded instead.
Pages that have not yet been written out will be unaffected, so if the application wishes to guarantee that pages will be
released, it should call fsync(2) or fdatasync(2) first.
说POSIX_FADV_DONTNEED只释放clean页面,dirty页面,并不受此影响,所以如果你是写了文件而没有用--sync选项的话,那么脏页面不会被释放,缓存也就不会被释放掉啦。所以使用dcache的时候应当清楚何时使用--sync选项。
在公司机器上做了一下实验,用一个4kw+行的文本文件,8GB做实验。
先 free -m看一下cached总数为48345M
total used free shared buffers cached
Mem: 64334 50469 13864 0 196 48345
然后wc -l 5kw.txt,读取一遍文件,wc输出文件行数为
44731963 5kw.txt
然后再free -m一遍看内存情况:
total used free shared buffers cached
Mem: 64334 58802 5532 0 204 56670
可以看到,cached page增加了8325M,与我们文件大小接近。然后使用dcache工具释放对应文件在系统中的缓存:
dcache 5kw.txt
drop cache of plsi_index.5kw.txt success.
再次使用free -m看到cached果然被释放了8GB,说明工具确实起到了作用。
free -m
total used free shared buffers
cached
Mem: 64334 50477 13856 0 204 48346
相关文章推荐
- 释放Linux操作系统文件缓存
- 释放Linux操作系统文件缓存
- Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限
- Linux操作系统下,删除文件后,但空间没能释放出来!
- Linux操作系统-文件(1)
- linux删除文件后没有释放空间
- linux文件缓存相关
- Linux操作系统下文件权限查看及修改方法
- 利用windows操作系统远程操作linux系统并上传文件
- linux 删除文件 磁盘空间未释放
- Linux操作系统文件系统基础知识详解
- 一个操作系统的实现(1):分析linux下如何运行一个执行文件
- linux释放缓存
- Linux操作系统下查找大文件或目录的技巧
- 经验分享-关于在linux下删除大文件后,磁盘空间没有得到释放的解决办法
- linux下的nginx中php文件出现缓存的问题
- 操作系统——linux系统文件目录机构
- 详解Linux手动释放缓存的方法
- 在linux操作系统上使用eclipse开发C++项目--引用so文件问题
- Linux操作系统文件链接问题