Nginx容器加载旧视频元数据后内存占用异常升高排查求助
排查Nginx容器加载旧视频时内存暴涨的方向
1. 调整Nginx文件缓存配置
Nginx默认会对首次访问的静态文件进行内存缓存,旧视频首次加载时可能被完整缓存导致内存飙升。你当前的配置未显式限制缓存,可针对性调整:
- 直接关闭文件缓存:在
http块或对应视频文件的location块中添加open_file_cache off; - 或限制缓存规模与有效期,避免旧文件长期占用内存:
open_file_cache max=100 inactive=10m; open_file_cache_valid 20m; open_file_cache_min_uses 1; open_file_cache_errors off; - 针对MP4文件单独配置内存缓存上限,避免一次性加载完整视频:
location ~* \.mp4$ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; expires 1d; add_header Cache-Control "public, no-transform"; }
2. 确认内存占用的真实来源
你提到无法定位占用内存的进程,可通过以下操作明确:
- 进入Nginx容器执行
ps aux --sort=-%mem,按内存占用排序进程,确认是否真的是Nginx worker进程,还是文件系统相关进程占用 - 在宿主机执行
docker stats --no-stream <nginx容器ID>,区分MEM USAGE中的实际内存占用与CACHE部分(Docker统计可能包含宿主机的page cache,这部分不属于容器RSS内存) - 用
docker exec -it <nginx容器ID> free -m查看容器内内存使用细节,确认是否存在内存泄漏或异常缓存
3. 检查视频存储与访问的差异
问题仅出现在旧视频上,需排查存储层面的差异:
- 确认旧视频与新视频是否在同一存储卷,存储介质是否不同(比如旧视频在机械硬盘,Nginx为优化读取会缓存更多内容)
- 检查旧视频的文件属性,是否存在碎片化或特殊权限,导致Nginx读取时需要额外内存处理
4. 优化React端视频加载逻辑
前端请求模式也可能间接导致Nginx内存压力:
- 修改
video标签的preload属性为metadata,避免页面加载时预加载完整视频:<video ref={videoRef} poster={props.poster} src={props.video_path} onLoadedMetadata={onLoad} onTimeUpdate={onTimeUpdate} playsInline preload="metadata" /> - 确认页面切换时是否销毁了视频组件,避免未关闭的视频连接导致Nginx持续保持缓存
5. 排查宿主机内核级缓存
Docker容器共享宿主机内核,宿主机的page cache可能被旧视频占满:
- 在宿主机执行
free -h查看cached部分占用,若过高可临时清理测试:sync && echo 3 > /proc/sys/vm/drop_caches,再次访问旧视频观察内存变化 - 检查宿主机是否开启swap,若swap频繁使用会导致应用冻结,需调整内存参数或增加宿主机内存
内容的提问来源于stack exchange,提问作者Константин Шляхов
相关产品推荐
相关产品推荐

