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

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

我目前在 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;

}

/etc/nginx/conf.d/默认.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. 禁用日志记录和 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/

答案2

一个好的起点是实际的 .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),或者对于语音 (低保真),考虑降低到 22050。

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

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

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

我的 ffmpeg fdk 参数...

-c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1 -signalinglicit_sbr -vbr 5 -ac 2 -ar 44100

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

mp4 脚本只是 ffmpeg 的一个包装器,它可以完成诸如猜测哪些音频 + 视频轨道是英文(对于多轨 avi + mkv 文件)+ 然后构建 ffmpeg 命令等任务。真正有趣的是实际的命令,它是多年实验的成果。

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

实验区域:-r $fps + -v:crf + -v:preset + -ar bitrate

稍加试验你就会得到最小文件大小+可接受质量的设置。

许多奇怪的选项(例如 +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' nice -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 -signaling explicit_sbr -vbr 5 -ac 2 -ar 44100 -metadata title='Foo (TC)' -threads 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

答案3

启用 multi_accept 对我来说是有用的(视频通常在中途停止,访问者无法收听/观看另一半,非常令人沮丧)。

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

events {
worker_connections 768;
multi_accept on;
}

**今天可以了,哈哈……明天我们只需要看看它是否还能正常播放

相关内容