NGINX非常低效地提供大型mp4文件


8

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

  • 英特尔(R)凌动(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;

}

/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;
    }
}

1
有什么特殊原因要过时吗?现在的稳定版本是1.8。
poige

@poige我今天早上将nginx更新为1.8稳定
Kennysmoothx

@poige另外,在查看iotop时,我注意到,我的大多数Nginx Worker进程(如果不是全部)通常突发速度高达1918 kb / s。那是我可能有的缓冲区限制吗?
Kennysmoothx

请参阅我的个人资料以获取联系信息。
poige

@Kennysmoothx在文件流传输期间共享sysstat和ifstat的输出
Anatoly

Answers:


5

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

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

组态:

events {
    accept_mutex off;
}

access_log off;
sendfile on;
sendfile_max_chunk 512k;

新的Nginx(1.7.11或更高版本)功能线程池在您的情况下会非常有用:

location / {
    root /home;
    aio threads;
    mp4;
}

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

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


我今天尝试了此操作,很不幸,没有进行任何改进。.我确实注意到我的nginx worker进程似乎达到了1918kb / s的读取速度,知道这个限制可能是多少?
Kennysmoothx

@Kennysmoothx Nginx的可能性较小,因为您几乎尝试了所有方法来配置它以有效地处理大型文件
Anatoly

@Kennysmoothx这很古老,但是您找到解决方案了吗?我会责怪您的主机,他们可能会超卖,这就是为什么您达不到1Gbps的原因。尝试使用相同的配置进行其他托管,看看会得到什么。
迈克尔·罗杰斯

4

一个不错的开始是从实际的.mp4文件开始,该文件通常需要大量改进。

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

对于此帖子,电影就像是电影或电视剧,其中每个帧都需要更改。换句话说,尝试将“ The Croods”之类的电影重新编码为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)或对于口语(低保真)考虑降至22050。

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

我经常压缩非电影文件,每1G压缩到10-20M。

第五,确保快速启动mov原子位于文件的开头,以便可以流式传输文件,而不是下载文件。

我的ffmpeg fdk参数...

-c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1-信号显式_sbr -vbr 5 -ac 2 -ar 44100

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

mp4脚本只是ffmpeg的包装,它可以做一些事情,例如猜测音频和视频轨道是英语的(对于多轨avi + mkv文件),然后构建ffmpeg命令。有趣的是实际命令,这是多年实验的残余。

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

实验范围:-r $ fps + -v:crf + -v:预设+ -ar比特率

进行一些实验可以为您提供最小文件大小和可接受质量的设置。

诸如+ genpts + clear SAR / DAR之类的许多奇怪选项都可以确保.mp4文件在Roku装置上播放。如果您每次都设置自己的Roku频道,则可以很好地保留这些频道,这是一种覆盖500万以上家庭的免费方式。

我的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'nice -19 ffmpeg -fflags + genpts -i“ foo.avi” -map 0:0 -c: v libx264 -crf:v 18-预设:v veryfast -tune:v电影-level:v 4.1 -profile:v高-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-信号显式_sbr -vbr 5 -ac 2 -ar 44100-元数据标题='Foo(TC)'-线程0 -f mp4-基准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


5
这个答案没有帮助,因为主要问题是使用Nginx有效地处理大型文件。
unwichtich '16

2

启用multi_accept对我有用(视频过去大约停了一半,访客无法收听/观看另一半,这非常令人沮丧)。

我在事件下在nginx.conf中设置的唯一内容是:

events {
worker_connections 768;
multi_accept on;
}

**今天它可以正常运作......明天我们只需要看看它是否仍能完全播放

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.