Linux下清空系统cache缓存

本文介绍Linux系统中如何查看内存状态,并提供清理缓存的方法,包括使用命令和编程方式来清除PageCache和dentry等,适用于进行内存敏感型应用测试。

在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

这个方法没有试验过


Linux上,你可以使用`fallocate`或`sync`命令结合`echo 3 > /proc/sys/vm/drop_caches`来强制清空内核缓冲区(包括buff和cache)。但是请注意,这个操作会影响性能,因为它会强制所有数据从内存写回磁盘。 下面是两种方法: 1. 使用`fallocate`和`sync`: ```cpp #include <unistd.h> int main() { int fd = open("/dev/shm", O_RDWR | O_CREAT, 0666); // 创建临时文件描述符 if (fd == -1) { perror("Failed to create temp file descriptor"); return 1; } // 清空缓存 off_t offset = 0; ssize_t len = 1 << 30; // 1GB (可以根据需要调整大小) while (len > 0) { ssize_t written = write(fd, "", len); if (written == -1) { perror("Write failed"); close(fd); return 1; } len -= written; sync(); // 强制同步到磁盘 } close(fd); return 0; } ``` 这段代码创建了一个临时文件描述符,然后不断尝试写入大量数据并同步,直到整个缓存被填满并写回磁盘。 2. 使用`/proc/sys/vm/drop_caches`: ```cpp #include <stdio.h> #include <stdlib.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 // 将drop_caches设置为3(释放全部缓存FILE* f = fopen("/proc/sys/vm/drop_caches", "w"); if (f != NULL) { fprintf(f, "%d\n", 3); fclose(f); printf("Caches flushed.\n"); exit(0); } else { perror("Failed to write to drop_caches"); exit(1); } } else if (pid > 0) { wait(NULL); // 等待子进程结束 } else { perror("Fork failed"); exit(1); } return 0; } ``` 在这个方法中,我们创建一个子进程,在那里修改`/proc/sys/vm/drop_caches`值为3,然后等待子进程结束。 执行以上任一方法后,请注意不要频繁地进行这种操作,因为这可能会对系统的响应时间产生负面影响。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值