HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理

一、直播服务器磁盘被大量旧 TS 分片占满

很多新手部署 HLS 直播,跑一段时间之后服务器磁盘空间直接爆满,大量过期 TS 分片堆积在磁盘目录。现象就是直播可以正常播放,服务器磁盘占用持续上涨,过几天磁盘写满,切片服务直接报错无法生成新分片。

很多人只知道设置hls_list_size控制 M3U8 清单里面保留多少分片,误以为设置这个参数之后旧的 TS 文件就会自动删除。hls_list_size 仅仅控制 M3U8 清单展示多少分片,它不会自动删除磁盘上旧的 ts 文件。

这个是非常多新手的重大误区。hls_list_size 只是修改 M3U8 文本内容,磁盘文件还会残留在硬盘,不会自动清理。日积月累磁盘就会爆满。

还有部分业务使用对象存储,分片不会删除,存储账单持续走高。很多线上故障根源就是缺少分片过期清理脚本。排查直播分片磁盘相关问题,我会使用 m3u8live.cn,查看直播 M3U8 清单,确认 hls_list_size 生效,再去服务器核对磁盘实际分片文件数量。

二、分片堆积常见原因

误区:设置 hls_list_size 就会自动删磁盘文件

hls_list_size:只修改 M3U8 清单里面展示的分片条目,旧 TS 磁盘文件不会自动删除。FFmpeg 本身不会做磁盘文件清理。

场景 1:FFmpeg 推流结束之后,遗留全部 ts 分片

推流停止,ffmpeg 进程退出,目录里面所有 TS 分片全部保留,不会自动删除。多次启停推流,分片越堆越多。

场景 2:长时直播,持续生成分片,没有定时清理脚本

直播连续跑几天,源源不断生成新分片,旧分片一直留在磁盘,磁盘持续上涨。

场景 3:多个直播频道,每个频道目录独立,全部堆积分片

多路直播同时运行,每一路都在堆积旧分片,整体磁盘消耗快速上涨。

场景 4:测试推流,进程异常崩溃,分片残留

测试环境反复启停推流,进程 crash 崩溃,大量分片文件残留在磁盘。

三、分片清理可行方案

方案 1:Linux 定时脚本,按文件过期时间删除

使用 crontab 定时执行脚本,删除 N 分钟之前的 ts 分片。直播业务只需要保留回看窗口对应的时长,超过这个时间的分片直接删除。

注意:不要删除正在被 M3U8 清单引用的分片,删除正在使用的分片会导致播放 404。清理的过期时间要大于 DVR 回看窗口时间。

方案 2:使用专门 HLS 切片服务,自带分片自动回收

成熟的流媒体服务框架,内部自带分片生命周期管理,分片到期自动删除,不用自己写脚本。

方案 3:对象存储场景,设置文件生命周期

如果 TS 分片存放在对象存储,配置生命周期规则,到期自动删除分片,不要靠程序手动删。

重要注意点:清理时间窗口,必须大于业务 DVR 回看最大时长。比如业务支持 30 分钟回看,分片至少保留 35 分钟再删除,否则回看的时候分片已经被删掉,请求 404。

四、运维注意事项

  1. hls_list_size 控制 M3U8 清单显示条目,不等于磁盘文件自动清理,这点一定要记牢。
  2. 定时脚本删除分片,过期阈值要大于回看窗口,不能删正在使用的分片。
  3. 推流异常崩溃也要考虑分片残留,测试环境同样要开启清理逻辑,不要只在生产配置。
  4. 增加磁盘使用率监控告警,磁盘使用率到达阈值触发告警,提前发现分片堆积。

五、排查简单流程

第一步,把直播 M3U8 粘贴网页调试工具,查看 M3U8 清单,确认 hls_list_size 已经生效,清单内分片数量符合预期。 第二步,登录服务器,ls 查看分片目录磁盘实际文件数量,对比 M3U8 清单内条目,就可以看到大量磁盘上存在但是清单已经不再引用的旧分片。 第三步,配置分片过期清理,清理时间大于 DVR 回看时长,避免误删还需要回看的分片。

六、总结

FFmpeg 的hls_list_size参数仅仅控制 M3U8 清单里面展示多少分片,不会自动删除磁盘上的旧 TS 分片。长时间运行直播,旧分片不断堆积,会把服务器磁盘占满。需要配置定时清理脚本或者对象存储生命周期,分片保留时长要大于业务 DVR 回看窗口,避免回看时分片已经被删除返回 404。借助网页调试工具确认 M3U8 清单配置,再核对服务器磁盘真实分片,处理分片堆积磁盘爆满问题。

相关推荐
张彦峰ZYF1 小时前
加了锁不等于扛得住争用:synchronized、显式锁与 CAS 的语义分层、争用代价账本与选型判据
后端·同步设施·内置锁的四种状态与单向升级·可重入的由来与四条硬边界·显式锁的状态字段与等待队列·读写锁与邮戳锁·一次同步的开销账本
专业程序开发源1 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
Gopher_HBo1 小时前
zap采样器与性能优化内幕
后端
变量探索SEQVEC1 小时前
我埋了 8 个假文件,看谁会上钩:12 天 502 次扫描实录
后端
用户094248568031 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
llqbzllll1 小时前
HashMap 的核心结构:从一次 put 看到扩容、桶迁移与树化边界
后端
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
晚安code2 小时前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
樱花落木兰2 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存