之前在嵌入式设备上做视频备份,将自主开发的用户文件系统中视频数据备份成ASF文件。由于涉及file io,遇到的一个问题是Linux会cache住那些asf文件,造成free内存减少。虽然这没有什么,但是为了稳定性考虑,我们的系统在free内存少于一个阈值时会告警。
当时采取的方式是,每备份一部分数据通过echo 3 > /proc/sys/vm/drop_caches来释放cache。现在想想那种方式真是有点“简单,粗暴”了。由于cache占用内存的增大是备份的asf文件引起的,所以针对性的释放asf文件占用的cache即可,而不用采用对整个系统都有影响的echo 3 > /proc/sys/vm/drop_caches方式。
用 posix_fadvise 的POSIX_FADV_DONTNEED可以准确的释放某个文件的某些部分数据所占用的cache。
#define _XOPEN_SOURCE 600
#include <fcntl.h>
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
有两个现成的工具可以查看文件所占用的cache,一个是linux-ftools,另一个是vmtouch。