Estou criando um perfil de computação (transcodificação de vídeo) em grandes conjuntos de dados. Como eu não queria que meus resultados fossem influenciados pelo tempo de E / S (o sistema que estou usando tem discos giratórios antigos / lentos), acho que o RAMFS seria a abordagem correta.
Eu criei uma pasta "cache" em minha casa como ramfs:
sudo mount ramfs -t ramfs ./cache/
Eu uso esta pasta para salvar os arquivos de entrada e saída do meu pipeline de processamento de vídeo. No entanto , parece que existe algum "caching" entre o disco e a RAM ao ler arquivos armazenados no RAMFS, o que acho que não deveria acontecer.
Primeiro eu copio o arquivo de vídeo de entrada para o cache, percebo que o arquivo é de cerca de 1,5 GB, daí a necessidade de RAMFS: link
cp crowd_run_1080p50.y4m ./cache/
Ao realizar uma operação de transcodificação, ler o arquivo que acabei de copiar e gravar no 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 ainda relata algumas falhas graves:
11,933 minor-faults:u
159 major-faults:u
3.588215239 seconds time elapsed
Executar a mesma operação novamente não mostra falhas graves nem tempo de conclusão significativamente mais rápido:
11,955 minor-faults:u
0 major-faults:u
2.129031238 seconds time elapsed
Ainda mais preocupante se eu liberar o cache de páginas do sistema operacional
sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
Eu vou ver grandes falhas novamente. Por que é que? Eu pensei que o arquivo inteiro permaneceria no RAMFS junto com os inodes e nenhum flush é possível de ramfs (ao contrário dos tmpfs que podem trocar). Por que ainda vejo grandes falhas? Se eu tiver que executar a mesma operação duas vezes para obter resultados confiáveis, é melhor não usar o RAMFS, mas gostaria de entender o que estou perdendo.