Reducción de IO causada por nginx

Reducción de IO causada por nginx

Tengo mucha RAM libre pero mi IO siempre es 100 % útil o muy cercana. ¿De qué maneras puedo reducir IO usando más RAM? Mi iotop muestra los procesos de trabajo de nginx con la tasa de io más alta. Este es un servidor de archivos que sirve archivos que van desde 1 MB a 2 GB. Aquí está mi nginx.conf

#user  nobody;
worker_processes  32;
worker_rlimit_nofile 10240;
worker_rlimit_sigpending 32768;

error_log  logs/error.log  crit;

#pid        logs/nginx.pid;


events {
    worker_connections  51200;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log  off;
    limit_conn_log_level info;
    log_format  xfs  '$arg_id|$arg_usr|$remote_addr|$body_bytes_sent|$status';

    sendfile       off;
    tcp_nopush     off;
    tcp_nodelay on;
    directio 4m;
    output_buffers 3 512k;
    reset_timedout_connection on;
    open_file_cache max=5000 inactive=20s;
    open_file_cache_valid    30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors   on;
    client_body_buffer_size 32k;

    server_tokens off;
    autoindex off;

    keepalive_timeout  0;
    #keepalive_timeout  65;

Respuesta1

Active el envío de archivos. Deje Output_buffers por defecto. Desactiva la dirección. Añade más RAM.

No hay nada mejor que el caché VFS de Linux.

Respuesta2

No acepte esta respuesta ya que es solo una observación. Pero utiliza IO directa para archivos de más de 4 M y solo permite a nginx 1,5 MB de memoria intermedia para archivos.

directio 4m;
output_buffers 3 512k;

Si no recuerdo mal, la IO directa básicamente omite el caché de IO del sistema de archivos para leer directamente desde el disco duro. Entonces, para archivos de más de 4 M, no usa memoria para almacenar el archivo en el buffer y para archivos de menos de 4 M, solo usa 1,5 M de memoria.

Respuesta3

Parece que desea atender algunas solicitudes directamente desde la memoria, lo que esencialmente equivale a almacenar en caché esas solicitudes. En su forma básica, procesará una solicitud, almacenará una copia en su caché basada en memoria y atenderá solicitudes posteriores para el mismo recurso desde la memoria (hasta el momento en que invalide/caduque la copia en caché).

La implementación de esto variará dependiendo de la naturaleza de su sitio (es decir, si proporciona archivos muy grandes, no será tan práctico; si su contenido es muy dinámico, no ofrecerá tantos beneficios, etc.), pero para un sitio 'promedio': dado que la mayor parte de la E/S de la página proviene de recursos estáticos (especialmente imágenes), reducirá la E/S del disco (y también debería acelerar las cosas).

Si está utilizando un proxy a un servidor backend, puede usar la directiva proxy_cache de nginx para almacenar en caché las páginas. Sin embargo, la ubicación de la caché suele estar en el disco (lo que puede acelerar las cosas, pero no se puede guardar en la E/S del disco). Puede solucionar esto creando un tmpfs asignado a la memoria (es decir, un disco RAM) en el que almacenar la caché. . Del mismo modo, si utiliza FastCGI, puede utilizar fastcgi_cache.

Otra opción similar (por ejemplo, si no utiliza nginx como proxy y no utiliza FastCGI) es almacenar páginas en MemCached. Nginx viene con un módulo memcached, que le permitirá configurar su propio mecanismo de almacenamiento en caché.

Alternativamente, puede simplemente agregar un proxy de almacenamiento en caché delante de Nginx (como Varnish), que recibirá solicitudes y las atenderá directamente o pasará la solicitud a Nginx. Varnish se puede configurar para almacenar su caché en la memoria (o en un archivo, aunque eso no ayudará a su E/S) y proporcionará visitas al caché con un mínimo de E/S de disco.

Respuesta4

worker_processes 32;

— ¿Todavía estás adivinando por qué?

Tengo mucha RAM libre pero

También me gustaría escuchar el razonamiento sobre tener sendfile off;y usar directio: ¿soy el único (seguramente no¹) que sabe que directio (por definición) prohíbe el almacenamiento en caché de FS?

__ ¹ — Martin F, al menos recordando esto también:Reducción de IO causada por nginx

información relacionada