NGINX Melayani File mp4 Besar dengan sangat tidak efisien

8

Saat ini saya menjalankan nginx / 1.0.15 pada OS Centos 6.6. Server memiliki spesifikasi berikut:

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

Masalah

Server memiliki koneksi 1Gbit / s, namun server ini keluar dan mengalami hambatan setelah 400-500 mbit / s. Layanan mulai menurun di sekitar 100 koneksi .. dan kecepatan dengan server turun secara dramatis (walaupun memiliki bandwidth 50% masih tersedia)

Server NGINX hanya untuk melayani file .mp4 statis. Setiap file biasanya 400-1200MB (rata-rata 700MB)

Saya telah mencoba banyak konfigurasi dan hampir semuanya memberikan saya hasil yang sama .. Saya sangat frustrasi ..

Beban server juga tidak pernah melewati 0,3.

Apakah ada sesuatu yang salah atau salah arah dalam konfigurasi saya? Apa pun bisa membantu.

Konfigurasi

/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;
    }
}
Kennysmoothx
sumber
1
Adakah alasan khusus untuk ketinggalan zaman? Versi stabil sekarang adalah 1.8.
poige
@poige Saya memperbarui nginx ke 1,8 stable pagi ini
Kennysmoothx
@poige Juga saya perhatikan saat melihat iotop, kebanyakan jika tidak semua proses pekerja nginx saya biasanya meledak hingga 1918 kb / s Baca. Apakah itu batas penyangga yang saya miliki?
Kennysmoothx
Lihat profil saya untuk info kontak.
poige
@Kennysmoothx membagikan output dari sysstat dan ifstat selama waktu streaming file
Anatoly

Jawaban:

5

Awal yang lebih baik dapat berupa seperangkat aturan berikut:

  1. nonaktifkan pencatatan dan accept_mutex
  2. aktifkan sendfile
  3. atur sendfile_max_chunk

Konfigurasi:

events {
    accept_mutex off;
}

access_log off;
sendfile on;
sendfile_max_chunk 512k;

Thread pool fitur Nginx (1.7.11 atau lebih baru) dapat sangat membantu dalam kasus Anda:

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

Pada sampel uji, ini secara dramatis membantu Anda meningkatkan bandwidth dari 1Gbps hingga 9Gbps. Sembilan kali! Anda hanya memiliki 1Gbps tetapi semuanya dimanfaatkan.

Lihat detail lebih lanjut: https://www.nginx.com/blog/thread-pools-boost-performance-9x/

Anatoly
sumber
Saya telah mencoba ini hari ini dan sayangnya tidak ada perbaikan .. Saya memang melihat bahwa proses pekerja nginx saya tampaknya unggul pada 1918kb / s baca spead, ada ide berapa batasnya?
Kennysmoothx
@Kennysmoothx kemungkinannya lebih kecil Nginx karena Anda mencoba hampir semuanya untuk mengkonfigurasinya untuk menyajikan file besar secara efisien
Anatoly
@ Kenennmoothx ini kuno, tetapi apakah Anda pernah menemukan solusi? Saya akan menyalahkan hosting Anda mereka mungkin menjual terlalu banyak itu sebabnya Anda tidak mencapai 1Gbps. Coba hosting yang berbeda dengan konfigurasi yang sama untuk melihat apa yang Anda dapatkan.
Michael Rogers
4

Tempat pertama yang baik untuk memulai adalah dengan file .mp4 yang sebenarnya, di mana biasanya ada area peningkatan besar.

Jadi sebelum tersesat dalam penyetelan NGINX atau Apache, tune terlebih dahulu file .mp4 Anda.

Untuk postingan sinematik ini seperti film atau acara televisi di mana setiap perubahan frame diperlukan. Dengan kata lain, mencoba mentranskode ulang film seperti "The Croods" ke 1 fps (bingkai / detik) akan mengurangi kualitas menjadi tidak dapat ditonton.

Dan non-sinematik mengacu pada tangkapan layar seperti Webinar courseware kami yang diposting ke Udemy.

Pertama, pertimbangkan komponen audio dari file tersebut. Jika komponen audio utamanya berbicara, maka gunakan ffmpeg untuk mentranskode ulang file tempat Anda menyalin aliran video (tidak ada perubahan) + ubah aliran stereo menjadi mono. Untuk banyak file .mp4 (non-sinematik) kira-kira 1/3 dari ukuran file film adalah video + 1/3 adalah saluran audio kiri + 1/3 adalah saluran audio yang tepat. Mengubah dari stereo ke mono, dapat sangat mengurangi ukuran file.

Kedua, retranscode audio menggunakan FDK-AAC ( https://github.com/mstorsjo/fdk-aac ) yang menghasilkan file yang jauh lebih kecil daripada encoder aac lainnya. Sebagian besar versi modern ffmpeg secara otomatis membuat FDK-AAC akhir-akhir ini. Bahkan Macports sekarang membuat ini. Satu pertimbangan, agar FDK dapat melakukannya, sihir asli memerlukan trek stereo + saat menggunakan kompresi audio stereo FDK yang jauh lebih kecil daripada mono, jadi jika Anda menggunakan FDK, gunakan stereo.

Ketiga, untuk mengurangi bitrate audio. Banyak kali ini adalah 48k, jadi pada umumnya menggunakan -ar 44100 (ffmpeg) atau untuk diucapkan (fi rendah) pertimbangkan untuk turun ke 22050.

Keempat, atur frame rate video Anda serendah mungkin. Jadi jika Anda melakukan tangkapan layar, bingkai hanya dapat berubah sekali dalam 10-60 detik, sehingga Anda dapat menjatuhkan frame rate menggunakan -r $ fps, berkali-kali dari 30-60 fps hingga 1-5 fps + kualitas tetap sama sementara ukuran file merosot.

Banyak kali saya kompres file non-sinematik di mana setiap 1G berkurang menjadi 10-20M.

Kelima, pastikan faststart mov atom ada di depan file Anda, sehingga file Anda dapat di-stream daripada diunduh.

Parameter fdk ffmpeg saya ...

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

Sebenarnya, inilah perintah ffmpeg lengkap yang khas ...

Skrip mp4 hanyalah pembungkus ffmpeg yang melakukan hal-hal seperti menebak di mana trek audio + video dalam bahasa Inggris (untuk file multitrack avi + mkv) + kemudian membangun perintah ffmpeg. Yang menarik adalah perintah yang sebenarnya, yang merupakan sisa dari eksperimen bertahun-tahun.

Coba jalankan file Anda melalui kompresi ffmpeg ekstrem terlebih dahulu, kemudian lihat apakah bobot file sangat rendah / kecil, tidak diperlukan penyetelan server Web.

Area percobaan: -r $ fps + -v: crf + -v: preset + -r bitrate

Sedikit bereksperimen akan memberi Anda pengaturan untuk ukuran file terkecil + kualitas yang dapat diterima.

Banyak opsi aneh seperti + genpts + kliring SAR / DAR ada untuk memastikan file .mp4 diputar di unit Roku. Ini bagus untuk disimpan, jika Anda setiap pengaturan Saluran Roku Anda sendiri, yang merupakan cara gratis untuk mencapai 5.000.000 rumah tangga.

Perintah ffmpeg saya ...

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-BPDirrier' nice -19 ffmpeg -fflags + genpts -i "foo.avi" -map 0: 0 -c: v libx264 -crf: v 18 -setet: v veryfast -tune: v film -level: v 4.1 -profil: v tinggi -ukuran: 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: aac_he_v2 -afterburner 1 -signaling eksplisit_sbr -vbr 5 -ac 2 -ar 44100 metadata title = 'Foo (TC)' -baca 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

David Favor
sumber
5
Jawaban ini tidak membantu karena masalah utama adalah melayani file besar secara efisien dengan Nginx.
unwichtich
2

Mengaktifkan multi_accept berhasil untuk saya (video yang digunakan untuk berhenti sekitar setengah dan pengunjung tidak dapat mendengarkan / menonton setengah lainnya, sangat membuat frustrasi).

Satu-satunya hal yang saya atur di nginx.conf di bawah event adalah ini:

events {
worker_connections 768;
multi_accept on;
}

** Ini bekerja hari ini LOL .... besok kita hanya perlu melihat apakah masih bermain sepenuhnya

kennyhendrick
sumber