Nginx volume Élevé de trafic d'équilibrage de la charge
Pour les 3 dernières semaines, nous avons testé des Nginx comme l'équilibre de la charge.
Actuellement, nous ne sommes pas réussir à gérer plus de 1000 req/sec et 18K connexions actives.
Quand nous arrivons à les chiffres ci-dessus, Nginx commence à accrocher, et renvoie délai codes.
La seule façon d'obtenir une réponse est de réduire le nombre de connexion de façon spectaculaire.
Je constate que mes serveurs peuvent gérer cette quantité de trafic sur une base quotidienne, et nous utilisons actuellement un rond simple rubin DNS équilibrage.
Nous sommes à l'aide d'un serveur dédié avec la suite de HW:
- INTEL XEON E5620 CPU
- 16 GO DE RAM
- 2T DISQUE DUR SATA
- 1Gb/s de connexion
- OS: CentOS 5.8
Nous avons besoin d'équilibrer la charge de 7 serveurs exécutant Tomcat6 et la manipulation de plus de 2000 req/sec sur peek fois, la manipulation des demandes HTTP et HTTPS.
Lors de l'exécution de Nginx la consommation cpu est autour de 15% et utilisé RAM est d'environ 100 mo.
Mes questions sont:
- Est-ce quelqu'un a essayé d'équilibrer la charge de ce genre de trafic à l'aide de nginx?
- Pensez-vous de nginx peut gérer un tel trafic?
- Avez-vous une idée de ce que peut provoquer la pendaison?
- Suis-je raté quelque chose sur mes configurations?
Ci-dessous sont mes fichiers de configuration:
nginx.conf:
user nginx;
worker_processes 10;
worker_rlimit_nofile 200000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10000;
use epoll;
multi_accept on;
}
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;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
reset_timedout_connection on;
gzip on;
gzip_comp_level 1;
include /etc/nginx/conf.d/*.conf;
}
serveurs.conf:
#Set the upstream (servers to load balance)
#HTTP stream
upstream adsbar {
least_conn;
server xx.xx.xx.34 max_fails=2 fail_timeout=15s;
server xx.xx.xx.36 max_fails=2 fail_timeout=15s;
server xx.xx.xx.37 max_fails=2 fail_timeout=15s;
server xx.xx.xx.39 max_fails=2 fail_timeout=15s;
server xx.xx.xx.40 max_fails=2 fail_timeout=15s;
server xx.xx.xx.42 max_fails=2 fail_timeout=15s;
server xx.xx.xx.43 max_fails=2 fail_timeout=15s;
}
#HTTPS stream
upstream adsbar-ssl {
least_conn;
server xx.xx.xx.34:443 max_fails=2 fail_timeout=15s;
server xx.xx.xx.36:443 max_fails=2 fail_timeout=15s;
server xx.xx.xx.37:443 max_fails=2 fail_timeout=15s;
server xx.xx.xx.39:443 max_fails=2 fail_timeout=15s;
server xx.xx.xx.40:443 max_fails=2 fail_timeout=15s;
server xx.xx.xx.42:443 max_fails=2 fail_timeout=15s;
server xx.xx.xx.43:443 max_fails=2 fail_timeout=15s;
}
#HTTP
server {
listen xxx.xxx.xxx.xxx:8080;
server_name www.mycompany.com;
location /{
proxy_set_header Host $host;
# So the original HTTP Host header is preserved
proxy_set_header X-Real-IP $remote_addr;
# The IP address of the client (which might be a proxy itself)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://adsbar;
}
}
#HTTPS
server {
listen xxx.xxx.xxx.xxx:8443;
server_name www.mycompany.com;
ssl on;
ssl_certificate /etc/pki/tls/certs/mycompany.crt;
# Path to an SSL certificate;
ssl_certificate_key /etc/pki/tls/private/mycompany.key;
# Path to the key for the SSL certificate;
location /{
proxy_set_header Host $host;
# So the original HTTP Host header is preserved
proxy_set_header X-Real-IP $remote_addr;
# The IP address of the client (which might be a proxy itself)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://adsbar-ssl;
}
}
server {
listen xxx.xxx.xxx.xxx:61709;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
sysctl.conf:
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values,
0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 1
# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
fs.file-max = 120000
net.ipv4.ip_conntrack_max = 131072
net.ipv4.tcp_max_syn_backlog = 8196
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_keepalive_time = 3600
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem = 4096 25165824 25165824
net.core.rmem_max = 25165824
net.core.rmem_default = 25165824
net.ipv4.tcp_wmem = 4096 65536 25165824
net.core.wmem_max = 25165824
net.core.wmem_default = 65536
net.core.optmem_max = 25165824
net.core.netdev_max_backlog = 2500
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
Toute l'aide, des conseils, des idées seront très appréciés.
Vous devez vous connecter pour publier un commentaire.
Voici quelques bonnes références:
http://dak1n1.com/blog/12-nginx-performance-tuning
Server erreur:
https://serverfault.com/questions/221292/tips-for-maximizing-nginx-requests-sec
Très bien documenté config à partir de la dak1n1 lien:
Également plus d'infos sur linux système de réglage pour sysctl.conf:
nginx doit certainement être en mesure de gérer plus de 1000 req/s (je reçois environ 2800 req/s dans nginx en jouant sur mon ordinateur portable pas cher avec jmeter à l'aide de l'un et une moitié des 2 cœurs)
Vous utilisez epoll qui est l'option optimale sur le noyau linux actuel tel que je le comprends.
Vous avez activé la acces_log off, de sorte que vous r'disque IO ne devrait pas être un goulot d'étranglement, soit (remarque: vous pouvez également définir la access_log à la mode mémoire tampon avec un grand tampon où il écrit seulement après chaque x ko, ce qui évite les entrées /sorties disque constamment martelé, mais conserve les journaux pour l'analyse)
Ma compréhension est que dans le but de maximiser nginx performance, normalement, vous définissez le nombre de worker_processes égal au nombre de core/cpu, et puis le nombre de worker_connections pour permettre à plus de connexions simultanées (selon le nombre de fichiers ouverts os limite). Pourtant, dans les données que vous avez posté ci-dessus vous avez un cpu quadcore avec 10 processus de travail avec 10k de connexions autorisées chaque. Par conséquent, sur la nginx côté, je voudrais essayer quelque chose comme:
Sur le noyau côté j'avais tune tcp lire et d'écrire les tampons de la même manière, vous voulez un petit minimum, petit défaut et grand max.
Vous ai fait monter la plage de ports éphémères déjà.
J'avais le numéro d'ouvrir des fichiers limite plus, comme vous l'aurez beaucoup de sockets ouverts.
Qui donne les lignes suivantes pour ajouter/modifier dans votre /etc/sysctl.conf
Espère que ça aide.
J'ai trouvé que le moyen le moins connecté algorithme a été problématique. Je suis passé à
et trouvé que le service beaucoup plus rapide.