8 votos

NGINX servicio a Grandes Archivos mp4 extremadamente ineficiente

Actualmente estoy ejecutando nginx/1.0.15 en un Centos 6.6 OS. El servidor tiene las siguientes especificaciones:

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

El Problema

El servidor tiene una 1Gbit/s de conexión, sin embargo, tops y los cuellos de botella después de 400-500 mbit/s. El servicio comienza a disminuir en aproximadamente 100 conexiones.. y la velocidad con la que el servidor se reduce drásticamente (a pesar de tener el 50% del ancho de banda disponible todavía)

El servidor NGINX es estrictamente para servir a la estática .los archivos mp4. Cada archivo es generalmente de 400-1200 MB (700MB, siendo el promedio)

He probado muchas configuraciones y casi todos ellos me dan los mismos resultados.. estoy muy frustrado..

La carga del servidor también que nunca pasa de 0,3.

Hay algo manifiestamente errónea o equivocada en mi configuración? Nada podría ser de ayuda.

Las Configuraciones

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

6voto

Anatoly Puntos 106

El mejor comienzo puede ser el conjunto de reglas siguientes:

  1. deshabilitar el registro y accept_mutex
  2. habilitar sendfile
  3. conjunto de sendfile_max_chunk

Configuración:

events {
    accept_mutex off;
}

access_log off;
sendfile on;
sendfile_max_chunk 512k;

Nueva Nginx (1.7.11 o más reciente) de la característica de grupo de subprocesos puede ser muy útil en tu caso:

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

En las muestras de la prueba es dramáticamente ayuda a aumentar el ancho de banda de 1 gbps hasta 9Gbps. Nueve veces! Usted tiene sólo 1 gbps, pero hace que todo sea utilizado.

Ver más detalles: https://www.nginx.com/blog/thread-pools-boost-performance-9x/

4voto

David Favor Puntos 1

Un buen lugar para comenzar es con el real .los archivos mp4, donde generalmente hay enormes áreas de mejora.

Así que antes de perderse en el ajuste de NGINX o Apache, primer tema de su .los archivos mp4.

Para este post cinematográfico es como una película o programa de televisión, donde cada fotograma es necesario el cambio. En otras palabras, tratando de retranscode una película como "Los Croods" a 1 fps (fotogramas por segundo) reduciría la calidad imposible de ver.

Y no cinematográfica se refiere a las capturas de pantalla, como seminarios web de nuestro material didáctico publicado en Udemy.

En primer lugar, considerar el componente de audio del archivo. Si el componente de audio es principalmente hablar, y luego usar ffmpeg para retranscode el archivo donde se copia la secuencia de vídeo (sin cambio) + convertir el fluido estéreo a mono. Para muchos .los archivos mp4 (no de cine), aproximadamente 1/3 de la película tamaño de archivo de vídeo + 1/3 es el canal de audio izquierdo + 1/3 es el canal de audio derecho. Cambiando de estéreo a mono, puede reducir considerablemente el tamaño del archivo.

Segundo, retranscode de audio utilizando las TECLAS-AAC (https://github.com/mstorsjo/fdk-aac) que produce mucho más pequeños que los archivos que otros aac codificadores. La mayoría de las versiones modernas de ffmpeg automagickally construir FDK-AAC estos días. Incluso Macports se basa ahora esto. Una consideración, para FDK hacer es magia real requiere de una pista estéreo + cuando se utilizan las TECLAS de audio estéreo comprime mucho más pequeño que el mono, así que si usted está utilizando las TECLAS, se adhieren con sonido estéreo.

En tercer lugar, para audio reducir la tasa de bits. Muchas veces, este es 48k, por lo que en el uso general -ar 44100 (ffmpeg) o hablado (low fi) considere la posibilidad de bajar a 22050.

Adelante, establecer la velocidad de fotogramas del vídeo tan bajo como sea posible. Así que si usted está haciendo una captura de pantalla, un cuadro sólo puede cambiar de vez en 10 a 60 segundos, por lo que puede caer velocidad de fotogramas utilizando -r $fps, muchas veces de 30-60 fps a 1-5 fps + calidad sigue siendo la misma, mientras que el tamaño del archivo se desploma.

Muchas veces me comprimir no cinemática archivos donde cada 1G reduce a 10-20M.

Quinto, asegúrese de que el comienzo acelerado mov átomo está en el frente de sus archivos, por lo que sus archivos pueden ser transmitidos en lugar de descargar.

Mi ffmpeg las teclas de los parámetros de...

-c:un libfdk_aac -perfil:un aac_he_v2 -afterburner 1 -señalización explicit_sbr -vbr 5 -ac 2 -ar 44100

De hecho, he aquí un típico completa comando ffmpeg...

El mp4 script es sólo una envoltura alrededor de ffmpeg que hace cosas como tomar una conjetura a la que el audio + vídeo pistas están en inglés (para multipista avi + mkv archivos) + luego construir el comando ffmpeg. Lo que es de interés es el comando real, que es el residuo de años de experimentos.

Intente ejecutar sus archivos a través de ffmpeg extrema de compresión en primer lugar, a continuación, comprobar si el archivo pesos son de tan bajo/pequeño, no hay ninguna Web de optimización del servidor requerido.

Áreas de experiencia: -r $fps + -v:crf + -v:preset + -ar bitrate

Un poco de experimentación le dará la configuración de tamaño de archivo más pequeño + calidad aceptable.

Muchos de los impares opciones como +genpts + compensación SAR/DAR están ahí para asegurarse .los archivos mp4 jugar en Roku unidades. Estos son buenos para mantener, en el caso de que cada instalación de su propio Canal de Roku, que es un camino libre para llegar a 5.000.000 de+ los hogares.

Mi comando ffmpeg...

imac> mp4 --dr-ruidoso foo.avi

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

cd '/Usuarios/david/Descargas/Casper.Una.De espíritu.Principio.1997.DVDrip.interna.XviD-BPDcarrier' nice -19 ffmpeg -fflags +genpts -i "foo.avi" -mapa de 0:0 -c:v libx264 -crf:v 18 -preset:v veryfast -melodía:v nivel de película:v 4.1 -perfil:v alto -bufsize:v 5000k -vf setdar=dar=0,setsar=sar=0 -x264opts colorprim=bt709:transferencia=bt709:colormatrix=bt709:fullrange=off-r 29.97 -movflags +faststart -mapa 0:1 -c:un libfdk_aac -perfil:un aac_he_v2 -afterburner 1 -señalización explicit_sbr -vbr 5 -ac 2 -ar 44100-metadatos title='Foo (TC)' -hilos 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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: