![Reducción de IO causada por nginx](https://rvso.com/image/567627/Reducci%C3%B3n%20de%20IO%20causada%20por%20nginx.png)
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