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


8

私は現在、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;
    }
}

1
時代遅れになる特定の理由はありますか?現在、安定版は1.8です。
poige 2015

@poige私は今朝nginxを1.8安定版に更新しました
Kennysmoothx 2015

@poige iotopを見ているときにも気付きましたが、ほとんどのnginxワーカープロセスは、通常1918 kb / sの読み取りまでバーストします。それは私が持っているかもしれないバッファ制限ですか?
Kennysmoothx 2015

連絡先情報については、私のプロフィールを参照してください。
poige 2015

@Kennysmoothxは、ファイルストリーミング中にsysstatとifstatの出力を共有します
Anatoly

回答:


5

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

  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/


私はこれを今日試してみましたが、残念ながら改善はありませんでした。nginxワーカープロセスが1918kb / sの読み取り速度で最高に達しているようであることに気付きました。
Kennysmoothx 2015

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

3番目に、オーディオのビットレートを減らします。多くの場合、これは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アトムがファイルの先頭にあることを確認します。

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


5
主な問題はNginxで効率的に大きなファイルを提供することなので、この回答は役に立ちません。
unwichtich 2016年

2

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

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

events {
worker_connections 768;
multi_accept on;
}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.