创建一个文件,用于以大块方式受控刷新到磁盘

创建一个文件,用于以大块方式受控刷新到磁盘

在 Linux 上,我有一个进程(ffmpeg)写入磁盘的速度非常慢(有时甚至慢于 1kb/s)。 FFmpeg 可以将其缓冲到不经常写入的 256kb 块,但 ffmpeg 偶尔会挂起,如果我尝试通过检查文件是否正在更新来检测这些挂起,我需要在更新之间等待很长时间,最多 10 或 15 分钟,否则我有时可能会错误地终止 ffmpeg 进程,当它看起来已停止写入时,实际上它仍在填充其内部缓冲区。

除非我使用 strace (无论如何我都能找到),否则似乎没有办法检测到这一点。所以我想知道关闭 ffmpeg 中的缓冲并从 ffmpeg 将无缓冲写入磁盘。

这将导致磁盘不断进行微小的写入并浪费电量(如果我使用 SSD,可能还会扰乱磨损均衡)。

所以我想让 ffmpeg 写入一个“虚拟文件”(在内存中 - 内核内存或进程),我可以指定它的刷新特性。这个想法可能是指定每 2 分钟刷新一次,然后我可以密切关注文件大小并确保它仍在写入。

我不认为我错过了任何其他方法来完成这项工作 - 即使我可以观察传入 ffpmeg 的套接字流,进程本身仍然可能停止写入并丢失数据。在 ffmpeg 之外进行缓冲似乎是最好的方法。

Linux 中是否有内置方法可以执行此操作,或者这是否意味着自定义进程?我想我知道如何用一个小型 C 程序来完成此操作并将数据通过管道输入,但我想知道是否有更简洁的方法。

答案1

您可以使用 GNUdd来实现此目的;它旨在以最佳方式读取/写入磁带驱动器时重新阻止数据。例如,将未缓冲的输出通过管道传输到:

dd obs=20k status=progress >/the/file

其中20k是每次写入磁盘时希望使用的输出块大小。k表示千字节。当status=progress你在 stderr 上得到一行,它会在写入完成时更新,例如

20480 bytes (20 kB, 20 KiB) copied, 12 s, 1.7 kB/s

如果您愿意,可以忽略此选项,并dd在希望它写出进度时使用信号 SIGUSR1 终止。

相关内容