我正在分析大型数据集上的一些计算(视频转码)。由于我不希望我的结果受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,但我想了解我所缺少的内容。
那是个很好的观点。我不认为获取代码会对结果有影响力有没有办法强制操作系统将特定的二进制文件和库放在页面缓存中?
—
igon
apt-get install memlockd
ffmpeg
(和包含的库)不在ramfs上。在里面~/bin