NGINX 以极低的效率提供大型 mp4 文件

Ken*_*thx 8 performance nginx hard-drive streaming

我目前在 Centos 6.6 操作系统上运行 nginx/1.0.15。服务器具有以下规格:

  • Intel(R) Atom(TM) CPU C2750 @ 2.40GHz(8 核)
  • 32GB 内存
  • 5 x 6000 GB 7200 RPM(Raid 10)

问题

服务器有 1Gbit/s 的连接,但是它在 400-500 mbit/s 后达到顶峰和瓶颈。服务在大约 100 个连接时开始下降......并且服务器的速度急剧下降(尽管仍有 50% 的带宽可用)

NGINX 服务器严格用于提供静态 .mp4 文件。每个文件通常为 400-1200MB(平均 700MB)

我尝试了许多配置,几乎所有配置都给了我相同的结果..我非常沮丧..

服务器负载也永远不会超过 0.3。

我的配置中是否有任何明显错误或误导?任何事情都可能有所帮助。

配置

/etc/nginx/nginx.conf

user              nginx;
worker_processes  9;

error_log  /var/log/nginx/error.log;


pid        /var/run/nginx.pid;


events {
    worker_connections  51200;
    use epoll;
 }

worker_rlimit_nofile 600000;

http {
    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;
access_log off;

aio on;
sendfile        off;
tcp_nopush      off;
tcp_nodelay      on;

#keepalive_timeout  0;
keepalive_timeout  65;

output_buffers 1 3m;
#gzip  on;

include /etc/nginx/conf.d/*.conf;

open_file_cache          max=10000 inactive=5m;
open_file_cache_valid    2m;
open_file_cache_min_uses 1;
open_file_cache_errors   on;

}
Run Code Online (Sandbox Code Playgroud)

/etc/nginx/conf.d/default.conf

server {
    listen       80 default_server sndbuf=32k;
    server_name  _;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    include /etc/nginx/default.d/*.conf;


    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /Videos/ {
        root /home;
        gzip off;
        gzip_static off;

        mp4;
        mp4_max_buffer_size   300m;
    }

    location /stats {
        stub_status on;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ana*_*oly 5

更好的开始可以是以下规则集:

  1. 禁用日志记录和 accept_mutex
  2. 启用发送文件
  3. 设置 sendfile_max_chunk

配置:

events {
    accept_mutex off;
}

access_log off;
sendfile on;
sendfile_max_chunk 512k;
Run Code Online (Sandbox Code Playgroud)

新的 Nginx(1.7.11 或更高版本)功能线程池对您的情况非常有帮助:

location / {
    root /home;
    aio threads;
    mp4;
}
Run Code Online (Sandbox Code Playgroud)

在测试样本上,它极大地帮助您将带宽从 1Gbps 增加到 9Gbps。九次!您只有 1Gbps,但它可以充分利用。

查看更多详情:https : //www.nginx.com/blog/thread-pools-boost-performance-9x/


小智 5

一个好的第一个起点是实际的 .mp4 文件,其中通常有大量需要改进的地方。

因此,在迷失调整 NGINX 或 Apache 之前,首先调整您的 .mp4 文件。

对于此后期电影来说,就像电影或电视节目一样,每个帧都需要更改。换句话说,尝试将像《疯狂原始人》这样的电影重新编码为 1 fps(帧/秒)会降低质量,导致无法观看。

非电影是指屏幕截图,例如我们发布到 Udemy 的课件的网络研讨会。

首先,考虑文件的音频部分。如果音频组件主要是说话,则使用 ffmpeg 重新转码复制视频流的文件(无变化)+ 将立体声流转换为单声道。对于许多 .mp4 文件(非电影),电影文件大小的大约 1/3 是视频 + 1/3 是左音频通道 + 1/3 是右音频通道。从立体声更改为单声道,可以大大减小文件大小。

其次,使用 FDK-AAC ( https://github.com/mstorsjo/fdk-aac ) 重新编码音频,该文件生成的文件比其他 aac 编码器小得多。如今,大多数现代版本的 ffmpeg 都会自动构建 FDK-AAC。甚至 Macports 现在也构建了这个。一个考虑因素是,要让 FDK 发挥其真正的魔力,需要立体声轨道+,当使用 FDK 立体声音频压缩比单声道小得多时,因此,如果您使用 FDK,请坚持使用立体声。

第三,针对音频降低比特率。很多时候这是 48k,因此一般使用 -ar 44100 (ffmpeg) 或对于口语(低 fi)考虑降至 22050。

第四,将视频的帧速率设置得尽可能低。因此,如果您正在进行屏幕捕获,帧可能只会在 10-60 秒内更改一次,因此您可以使用 -r $fps 降低帧速率,多次从 30-60 fps 降至 1-5 fps + 质量保持不变同时文件大小直线下降。

很多时候我会压缩非电影文件,每 1G 减少到 10-20M。

第五,确保 faststart movatom 位于文件的前面,这样您的文件就可以流式传输而不是下载。

我的 ffmpeg fdk 参数...

-c:libfdk_aac -配置文件:aac_he_v2 -afterburner 1 -信令explicit_sbr -vbr 5 -ac 2 -ar 44100

事实上,这是一个典型的完整 ffmpeg 命令......

mp4 脚本只是 ffmpeg 的包装器,它可以执行一些操作,例如猜测哪些音频+视频轨道是英文的(对于多轨 avi + mkv 文件)+然后构建 ffmpeg 命令。令人感兴趣的是实际的命令,它是多年实验的残留物。

首先尝试通过 ffmpeg 极限压缩运行文件,然后查看文件权重是否如此低/小,是否不需要 Web 服务器调整。

实验领域:-r $fps + -v:crf + -v:preset + -ar 比特率

一些实验将为您提供最小文件大小+可接受的质量的设置。

许多奇怪的选项(例如 +genpts + 清除 SAR/DAR)可确保 .mp4 文件在 Roku 设备上播放。这些很好保留,以防您设置自己的 Roku 频道,这是覆盖 5,000,000 多个家庭的免费方式。

我的 ffmpeg 命令...

imac> mp4 --dr --noisy foo.avi

tc: diag=v:!h264:mpeg4,a:!aac:ac3 title='Foo (TC)' Foo-640x480-veryfast-crf18-max-tc.mp4

cd '/Users/david/Downloads/Casper.A.Spirited.Beginning.1997.DVDrip.iNTERNAL.XviD-BPDcarrier' 不错 -19 ffmpeg -fflags +genpts -i "foo.avi" -map 0:0 -c: v libx264 -crf:v 18 -preset:v veryfast -tune:v film -level:v 4.1 -profile:v high -bufsize:v 5000k -vf setdar=dar=0,setsar=sar=0 -x264opts colorprim=bt709 :transfer=bt709:colormatrix=bt709:fullrange=off -r 29.97 -movflags +faststart -map 0:1 -c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1 -信令explicit_sbr -vbr 5 -ac 2 -ar 44100 -元数据标题 = 'Foo (TC)' -线程 0 -f mp4 -benchmark Foo-640x480-veryfast-crf18-max-tc.mp4.tmp mv -f Foo-640x480-veryfast-crf18-max-tc.mp4.tmp Foo-640x480-veryfast-crf18-max-tc.mp4

  • 这个答案没有帮助,因为主要问题是使用 Nginx 有效地提供大文件。 (7认同)