![Reduzierung der durch Nginx verursachten IO](https://rvso.com/image/567627/Reduzierung%20der%20durch%20Nginx%20verursachten%20IO.png)
Ich habe viel freien RAM, aber meine IO ist immer 100 % oder fast 100 % Auslastung. Wie kann ich die IO durch die Verwendung von mehr RAM reduzieren? Mein iotop zeigt die Nginx-Arbeitsprozesse mit der höchsten IO-Rate. Dies ist ein Dateiserver, der Dateien von 1 MB bis 2 GB bereitstellt. Hier ist meine 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;
Antwort1
Sendfile einschalten. Output_Buffer standardmäßig belassen. Directio ausschalten. Mehr RAM hinzufügen.
Es gibt nichts Besseres als den Linux-VFS-Cache.
Antwort2
Bitte akzeptieren Sie diese Antwort nicht, da es sich nur um eine Beobachtung handelt. Aber Sie verwenden direkte IO für Dateien über 4 MB und erlauben nginx nur 1,5 MB Speicherpuffer für Dateien.
directio 4m;
output_buffers 3 512k;
Wenn ich mich richtig erinnere, umgeht Direct IO grundsätzlich den IO-Cache des Dateisystems, um direkt von der Festplatte zu lesen. Für Dateien über 4 MB wird also kein Speicher zum Puffern der Datei verwendet, und für Dateien unter 4 MB wird nur 1,5 MB Speicher verwendet.
Antwort3
Es scheint, dass Sie einige Anfragen direkt aus dem Speicher bedienen möchten – was im Wesentlichen darauf hinausläuft, diese Anfragen zwischenzuspeichern. In der Grundform verarbeiten Sie eine Anfrage, speichern eine Kopie in Ihrem speicherbasierten Cache und bedienen nachfolgende Anfragen für dieselbe Ressource aus dem Speicher (bis Sie die zwischengespeicherte Kopie ungültig machen/ablaufen lassen).
Die Implementierung hängt von der Art Ihrer Site ab (wenn Sie also sehr große Dateien bereitstellen, ist dies nicht so praktisch – wenn Ihr Inhalt sehr dynamisch ist, bietet es nicht so viele Vorteile usw.). Bei einer „durchschnittlichen“ Site, bei der die meisten Ein-/Ausgabevorgänge der Seite von statischen Ressourcen (insbesondere Bildern) stammen, wird hierdurch jedoch der Datenträger-Ein-/Ausgabevorgang reduziert (und die Dinge sollten auch schneller werden).
Wenn Sie einen Backend-Server per Proxy verwenden, können Sie die Proxy_cache-Direktive von nginx verwenden, um Seiten zwischenzuspeichern. Der Cache-Speicherort befindet sich jedoch normalerweise auf der Festplatte (was zwar die Dinge beschleunigen kann, aber möglicherweise keine Festplatten-E/A spart). Sie können dies umgehen, indem Sie ein dem Speicher zugeordnetes tmpfs (d. h. eine Ramdisk) erstellen, in dem Sie Ihren Cache speichern. Wenn Sie FastCGI verwenden, können Sie ebenfalls fastcgi_cache verwenden.
Eine andere, ähnliche Option (z. B. wenn Sie nginx nicht als Proxy und nicht FastCGI verwenden) besteht darin, Seiten in MemCached zu speichern. Nginx verfügt über ein Memcached-Modul, mit dem Sie Ihren eigenen Caching-Mechanismus einrichten können.
Alternativ können Sie einfach einen Caching-Proxy vor Nginx hinzufügen (z. B. Varnish), der Anfragen empfängt und diese entweder direkt verarbeitet oder die Anfrage an Nginx weiterleitet. Varnish kann so konfiguriert werden, dass sein Cache im Speicher (oder in einer Datei – das hilft allerdings nicht bei Ihren E/A-Vorgängen) gespeichert wird und Cache-Treffer mit einem Minimum an Festplatten-E/A verarbeitet.
Antwort4
worker_processes 32;
– raten Sie immer noch, warum?
Ich habe viel freien RAM, aber
Ich würde auch gerne Begründungen zum Vorhandensein sendfile off;
und Verwenden hören directio
– bin ich der Einzige (sicherlich nicht¹), der weiß, dass Directio (per Definition) das Caching des FS verbietet?
__ ¹ — Martin F, der sich zumindest auch daran erinnert:Reduzierung der durch Nginx verursachten IO