web-dev-qa-db-ja.com

NGINXが非常に非効率的に大きなmp4ファイルを提供する

私は現在、Centos 6.6 OSでnginx/1.0.15を実行しています。サーバーには次の仕様があります。

  • Intel(R)Atom(TM)CPU C2750 @ 2.40GHz(8コア)
  • 32GB RAM
  • 5 x 6000 GB 7200 RPM(RAID 10)

問題

サーバーは1ギガビット/秒の接続を備えていますが、400〜500メガビット/秒の後に最高の状態になり、ボトルネックになります。約100接続でサービスが低下し始めます。サーバーとの速度は劇的に低下します(50%の帯域幅がまだ利用可能であるにもかかわらず)。

NGINXサーバーは、静的な.mp4ファイルを提供するためのものです。各ファイルは通常400〜1200 MBです(平均は700 MB)。

私は多くの多くの構成を試しましたが、それらのほとんどすべてが同じ結果を与えてくれます。非常にイライラしています。

サーバーの負荷も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;
    }
}
8
Kennysmoothx

より良いスタートは、次のルールのセットです:

  1. ロギングを無効にし、accept_mutex
  2. sendfileを有効にする
  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;
}

テストサンプルでは、​​帯域幅を1 Gbpsから最大9 Gbpsに劇的に増やすことができます。九回!たったの1Gbpsですが、すべてが利用されています。

詳細をご覧ください: https://www.nginx.com/blog/thread-pools-boost-performance-9x/

4
Anatoly

まず最初に、実際の.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がそれを行うための1つの考慮事項は、FDKステレオオーディオ圧縮を使用する場合、ステレオトラック+モノラルよりもはるかに小さい圧縮が必要であるため、FDKを使用している場合は、ステレオを使用することです。

第三に、オーディオのビットレートを減らします。多くの場合、これは48kなので、一般的に-ar 44100(ffmpeg)または音声(low fi)を使用する場合は、22050に下げることを検討してください。

4つ目は、ビデオのフレームレートをできるだけ低く設定することです。したがって、画面キャプチャを実行している場合、フレームは10〜60秒に1回しか変更されない可能性があるため、-r $ fpsを使用してフレームレートをドロップできます。30〜60 fpsから1〜5 fpsまで何度も+品質は変わりません一方、ファイルサイズは急落します。

多くの場合、1Gごとに10〜20Mに減る非シネマティックファイルを圧縮します。

5番目に、ファイルのダウンロードではなくストリーミングできるように、faststart mov atomがファイルの先頭にあることを確認します。

私のffmpeg fdkパラメータ...

-c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1 -signaling 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のクリアなどの奇妙なオプションの多くは、Rokuユニットで.mp4ファイルを確実に再生するためにあります。これらは、500万以上の世帯に無料で到達できる独自のRokuチャネルをセットアップする場合に備えておくと便利です。

私の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
David Favor

Multi_acceptをオンにするとうまくいきました(ビデオは半分ほど止まり、訪問者はもう半分を聞く/見ることができず、非常にイライラしました)。

イベントでnginx.confに設定した唯一のものは次のとおりです。

events {
worker_connections 768;
multi_accept on;
}

**今日は機能しますLOL ....明日はまだ完全に機能するかどうかを確認する必要があります

1
kennyhendrick