我正在对大型数据集上的一些计算(视频转码)进行分析。由于我不希望结果受到 I/O 时间的影响(我使用的系统有旧的/慢速旋转的磁盘),我认为 RAMFS 是正确的方法。
我在家里创建了一个“缓存”文件夹作为 ramfs:
sudo mount ramfs -t ramfs ./cache/
我使用这个文件夹来保存我的视频处理管道的输入和输出文件。然而,看起来在读取存储在 RAMFS 中的文件时,磁盘和 RAM 之间仍然有一些“缓存”,我认为这不应该发生。首先,我将输入视频文件复制到缓存中,注意该文件大约为 1.5 GB,因此需要 RAMFS:https://media.xiph.org/video/derf/y4m/crowd_run_1080p50.y4m
cp crowd_run_1080p50.y4m ./cache/
执行转码操作时,读取刚刚复制的文件并写入 RAMFS
perf stat -e minor-faults:u,major-faults:u ~/bin/ffmpeg -i ~/cache/crowd_run_1080p50.y4m -c:v h264_qsv -y ~/cache/out_qsv.mp4
perf 仍然报告一些主要故障:
11,933 minor-faults:u
159 major-faults:u
3.588215239 seconds time elapsed
再次运行相同的操作,没有发现重大故障,并且完成时间明显加快:
11,955 minor-faults:u
0 major-faults:u
2.129031238 seconds time elapsed
如果我刷新操作系统的页面缓存,情况会更加麻烦
sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
我将再次看到重大故障。这是为什么?我认为整个文件将与 inode 一起保留在 RAMFS 中,并且无法从 ramfs 刷新(与可以交换的 tmpfs 不同)。为什么我仍然看到重大故障?如果我必须执行两次相同的操作才能获得可靠的结果,我还不如不使用 RAMFS,但我想了解我遗漏了什么。