You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Константин Шляхов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:01:06