Nginx容器在绑定卷上发送视频元数据后增加了内存使用



我有一个AWS服务器,那里运行着一个docker容器服务器包含大量mp4视频(几百GB(每个视频大约有30 MB

其中一项服务是React应用程序,它允许逐个观看视频,但页面上的视频总数为5-20

每次当我打开一个页面,里面有从未观看过的视频时,nginx容器都会增加50-150MB的内存使用量,最终整个应用程序都会被冻结。

应用程序不适合高负载(一次1-2个用户(,所以我使用

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
worker_connections  1024;
}
http {
resolver 127.0.0.11 ipv6=off;
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  main;
sendfile        on;
keepalive_timeout  65;
client_max_body_size 5M;
include /etc/nginx/conf.d/*.conf;` 

在nginx设置中。

容器也只是简单地绑定到带有视频的目录。

有趣的是,在重新启动容器后,内存使用率将下降到正常的2-3MB,并且如果我打开最近几天打开的页面,则不会上升

所以问题是可复制的,只有旧的页面,其中包含非常旧的视频

在nginx容器中,一切都很平静,进程和工作人员的内存使用率很低,所以我甚至不知道谁在使用内存

有人知道在哪里挖掘来修复这种不需要的"缓存"吗?

react代码很长,所以我不能在这里全部分享,但一般来说,它是一个组件的视频,所以在最小的组件中,它看起来是这样的:

import React 'react';
const EVideo = ({
props,
}) => {
const onLoad = e => {// some logic to set initial playback rate}
const onTimeUpdate = e => {//some logic to calculate video time into business logic time}
return
(<><video
ref={videoRef}
poster={props.poster}
src={props.video_path}
onLoadedMetadata={onLoad}
onTimeUpdate={onTimeUpdate}
playsInline
/>
<div>Here business logic results will be shown</div>
</>)
}

这是由于您正在使用的浏览器的预加载行为造成的。浏览器正在预取尚未看到的视频。您可以使用视频元素的preload属性控制浏览器的此默认行为。

在视频元素中设置preload=none会阻止浏览器预取视频。点击此处了解更多关于preload的信息。

最新更新