2017-04-14 5 views
0

Nginx agit comme un proxy inverse pour adserver, recevant 20k demandes par minute. Réponse se produit dans 100ms de la AdServer à l'nginxConfiguration de Nginx et sysctl - Paramètre de performance

Fonctionnant sur une machine virtuelle avec la configuration comme 128Go RAM 4 vCPU 100Go HDD

Compte tenu ci-dessus, ce qui est bon réglage Nginx et aussi sysctl.conf

Répondre

2

Veuillez garder à l'esprit que le réglage du noyau est complexe et nécessite beaucoup d'évaluation jusqu'à ce que vous obteniez les résultats corrects. Si quelqu'un remarque une erreur, faites-le moi savoir afin que je puisse ajuster ma propre configuration :-)

De plus, votre mémoire est assez élevée pour le nombre de requêtes si ce serveur fonctionne uniquement avec Nginx, vous pouvez vérifier combien vous utilisez pendant les heures de pointe et ajustez en conséquence.

Une chose importante à vérifier est le nombre de descripteurs de fichiers, dans votre situation, je le mettrais à 65.000 pour faire face aux 20.000+ demandes par seconde. La raison en est que dans une situation normale, vous ne devriez avoir que 4.000 descripteurs de fichiers, car vous avez 4.000 connexions ouvertes simultanées (20.000 * 2 * 0.1). Toutefois, en cas de problème avec un back-end, il peut prendre jusqu'à 1 seconde ou plus pour charger une publicité. Dans ce cas, le nombre de connexions ouvertes simultanious serait plus élevé:

20.000 * 2 * 1.5 = 60.000. 

donc la mise à 65K serait à mon avis une valeur sauver.

Vous pouvez vérifier la quantité de descripteurs de fichiers via:

cat /proc/sys/fs/file-max 

Si cela est en dessous du 65000, vous aurez besoin de mettre cela dans le /etc/sysctl.conf:

fs.file-max = 65000 

aussi pour Nginx vous devrez ajouter ce qui suit dans le fichier: /etc/systemd/system/nginx.service.d/override.conf

[Service] 
LimitNOFILE=65000 

Dans le fichier nginx.conf:

worker_rlimit_nofile 65000; 

Si l'on ajoute que vous aurez besoin pour appliquer les modifications:

sudo systemctl -p 
sudo systemctl daemon-reload 
sudo systemctl restart nginx 

Après ces paramètres les paramètres suivants vous initieront:

vm.swappiness = 0 # The kernel will swap only to avoid an out of memory condition 
vm.min_free_kbytes = 327680 # The kernel will start swapping when memory is below this limit (300MB) 

vm.vfs_cache_pressure = 125 # reclaim memory which is used for caching of VFS caches quickly 
vm.dirty_ratio = 15 # Write pages to disk when 15% of memory is dirty 
vm.dirty_background_ratio = 10 # System can start writing pages to disk when 15% of memory is dirty 

De plus, j'utilise les paramètres de sécurité suivants dans ma configuration sysctl en conjonction avec les réglages ci-dessus. Ne hésitez pas à les utiliser, for credits

# Avoid a smurf attack 
net.ipv4.icmp_echo_ignore_broadcasts = 1 
# Turn on protection for bad icmp error messages 
net.ipv4.icmp_ignore_bogus_error_responses = 1 
# Turn on syncookies for SYN flood attack protection 
net.ipv4.tcp_syncookies = 1 
# Turn on and log spoofed, source routed, and redirect packets 
net.ipv4.conf.all.log_martians = 1 
net.ipv4.conf.default.log_martians = 1 
# No source routed packets here 
net.ipv4.conf.all.accept_source_route = 0 
net.ipv4.conf.default.accept_source_route = 0 
# Turn on reverse path filtering 
net.ipv4.conf.all.rp_filter = 1 
net.ipv4.conf.default.rp_filter = 1 
# Make sure no one can alter the routing tables 
net.ipv4.conf.all.accept_redirects = 0 
net.ipv4.conf.default.accept_redirects = 0 
net.ipv4.conf.all.secure_redirects = 0 
net.ipv4.conf.default.secure_redirects = 0 
# Don't act as a router 
net.ipv4.ip_forward = 0 
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.default.send_redirects = 0 
# Turn on execshild 
kernel.exec-shield = 1 
kernel.randomize_va_space = 1 

Comme vous le mandatement demande, j'ajouter la ligne suivante à votre fichier sysctl.conf pour vous assurer que vous n'êtes pas en cours d'exécution sur les ports, il est facultatif, mais si vous êtes en cours d'exécution en questions, il est quelque chose à garder à l'esprit:

net.ipv4.ip_local_port_range=1024 65000 

Comme je l'ai normalement les évalue les paramètres par défaut et ajuster en conséquence, je ne l'ai pas fournir l'IPv4 et ipv4.options tcp_ Vous pouvez trouver un exemple ci-dessous, mais s'il vous plaît ne pas copier et coller, vous devrez lire avant de commencer à régler ces variables.

# Increase TCP max buffer size setable using setsockopt() 
net.ipv4.tcp_rmem = 4096 87380 8388608 
net.ipv4.tcp_wmem = 4096 87380 8388608 
# Increase Linux auto tuning TCP buffer limits 
# min, default, and max number of bytes to use 
# set max to at least 4MB, or higher if you use very high BDP paths 
# Tcp Windows etc 
net.core.rmem_max = 8388608 
net.core.wmem_max = 8388608 
net.core.netdev_max_backlog = 5000 
net.ipv4.tcp_window_scaling = 1 

Les paramètres ci-dessus n'est pas tout ce que vous devriez considérer, il y a beaucoup plus de paramètres que vous pouvez régler, pour example:

  • Définissez la quantité de processus de travail à 4 (un par noyau CPU) .
  • Réglez la file d'attente de backlog.
  • Si vous n'avez pas besoin d'un journal d'accès, je l'éteindrais simplement pour retirer les E/S du disque.
  • Facultatif: réduisez ou désactivez la compression gzip si votre utilisation du processeur atteint un niveau élevé.