Linux下清空系统cache缓存

来源:互联网 发布:mac 查看照片拍摄日期 编辑:程序博客网 时间:2024/06/05 06:45

在Linux系统下,通过命令可以查看内存状态,比如

# more /proc/meminfo 
MemTotal:     16423848 kB
MemFree:       3008348 kB
Buffers:        272916 kB
Cached:       12539184 kB
SwapCached:          0 kB
Active:        3473960 kB
Inactive:      9512632 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     16423848 kB
LowFree:       3008348 kB
SwapTotal:    16386292 kB
SwapFree:     16386292 kB
Dirty:             176 kB
Writeback:           0 kB
AnonPages:      174440 kB
Mapped:          52192 kB
Slab:           361836 kB
PageTables:      19220 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  24598216 kB
Committed_AS:   883256 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    274632 kB
VmallocChunk: 34359463459 kB
HugePages_Total:     0
各项的具体含义,这里不具体解释,其中有一项是cached,指的是目前被缓存的内容,可能被下次访问用到,也可能被替换出去,一般都与Linux系统自动管理,不过在做某些测试时,不希望cache干扰,可以通过下面的方法来进行清理,即执行两条命令。

#sync
#echo 3 > /proc/sys/vm/drop_caches

执行完后,再查看内存状态,如下:

# more /proc/meminfo 
MemTotal:     16423848 kB
MemFree:      16099556 kB
Buffers:           360 kB
Cached:          52720 kB

...

除了这个方法之外,还在网上找到这么一段程序,据说可以清空某个指定文件的缓存,不过发现对于NFS不起作用,放在这里朋友一块交流交流。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
main(int argc,char **argv)
{
        int fd,result;
        if (argc < 2){
                printf("Usage: %s filename\n", argv[0]);
                _exit(-1);
        }
        printf("Opening: %s\n",argv[1]);
        fd = open(argv[1], O_RDWR);
        //printf("FD: %d\n",fd);
        if (fd < 0){
                printf("open file failed\n");
                _exit(-1);
        }
        //result = posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
        result = posix_fadvise(fd, 0, 0, 4);
        printf("Result: %d\n",result);
        close(fd);
        _exit(0);
}




linux下读写文件时,OS会为文件建立缓存,用以提高速度。这部分用于缓存的内存,在文件关闭后,仍然不会被释放(什么时候会被释放不得而知)。

但是在内存使用有限度或者文件很大的情况下,有时需要马上释放缓存或者禁止使用缓存。

有以下两种方法。

1,posix_fadvise函数

int posix_fadvise(int fd, off_t offset, off_t len, int advice);
posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
len=0表示文件全部

POSIX_FADV_DONTNEED表示告诉os,这个文件在最近一段时间内不会被使用

试验了一下,发现文件打开后读写前使用这个函数没有用处

文件读写之后关闭之前使用有用

2,/proc/sys/vm/drop_caches    Linux 2.6.16 以后有效

释放PageCache echo 1 > /proc/sys/vm/drop_caches

释放dentry、inode    echo 2 > /proc/sys/vm/drop_caches

释放PageCache dentry、inode  echo 3 > /proc/sys/vm/drop_caches

这个方法没有试验过


原创粉丝点击