多进程池调用FFMPEG生成视频出现BlockingIOError: [Errno 11]问题咨询
报错根因定位
你遇到的BlockingIOError: [Errno 11] Resource temporarily unavailable本质不是磁盘IO瓶颈,和你观测到的IO使用率低的情况完全吻合,这个错误触发在subprocess创建ffmpeg子进程的环节,属于操作系统层面的资源配额耗尽问题,常见触发原因有两个:
- 单进程允许打开的最大文件描述符数达到上限,多进程池同时启动大量ffmpeg实例时,每个实例都会占用管道、文件句柄等资源,累计超过上限就会触发该报错
- 系统全局的进程数限额被打满,多进程池的每个工作进程都会fork出ffmpeg子进程,短时间进程数暴涨超过系统
pid_max限制也会出现该错误
线程化方案的适配性
将写入调用改为线程化的方案不能解决根本问题,且不适合在多进程池场景下使用:
- 不管用进程还是线程调度写入任务,最终都要创建ffmpeg子进程,只要并发创建的子进程数量超过系统配额,报错依然会触发
- 多进程池场景下叠加多线程逻辑,反而会增大资源调度的复杂度,容易出现锁竞争、资源争抢的问题,稳定性会更差
可行优化方案
- 降低多进程池的最大并发数,建议设置为和服务器物理CPU核心数一致,避免短时间内批量创建大量ffmpeg子进程打满系统资源
- 调高系统允许的最大文件描述符配额,临时调整可执行命令
ulimit -n 65535,永久生效需要修改/etc/security/limits.conf,添加如下配置:
* soft nofile 65535 * hard nofile 65535
- 调用
write_videofile时传入threads=1参数,限制单个ffmpeg进程的内部线程数,减少单任务的资源占用 - 在任务逻辑中添加重试机制,捕获到
BlockingIOError后等待1~2秒再重试执行写入逻辑,规避瞬时资源高峰导致的偶发报错
内容的提问来源于stack exchange,提问作者mugetsu
相关产品推荐
相关产品推荐

