3 votes

Comment déboguer pourquoi mon serveur a un délai de 3 secondes sur chaque requête nginx/unicorn?

Je suis en train de déboguer pourquoi mon serveur a un retard de 3 secondes sur chaque demande.

entrer la description de l'image ici

Voici mes fichiers de configuration nginx et unicorn : https://gist.github.com/regedarek/de7f2e5cd1918b6224ac

Les informations de mon serveur :

  Bienvenue sur Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-37-generic x86_64)

  Charge du système :  0.02              Processus :           71
  Utilisation de / :   38.9% de 6.89 Go   Utilisateurs connectés :     0
  Utilisation de la mémoire : 28%               Adresse IP pour eth0 : 149.156.119.151
  Utilisation du swap :   0%

serveur:~$ cat /proc/cpuinfo
processeur       : 0
identifiant du fournisseur       : AuthenticAMD
famille du processeur      : 6
modèle           : 2
nom du modèle      : QEMU Virtual CPU version 1.0
pas          : 3
microcode       : 0x1000065
cpu MHz         : 2300.026
taille du cache      : 512 Ko
fpu             : oui
fpu_exception   : oui
niveau cpuid     : 4
wp              : oui
drapeaux           : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm up nopl pni cx16 popcnt hypervisor lahf_lm svm abm sse4a
bogomips        : 4600.05
taille TLB        : 1024 pages 4K
taille clflush    : 64
alignement du cache : 64
tailles des adresses   : 40 bits physique, 48 bits virtuel
gestion de l'alimentation :

Voici la sortie de tcpdump -qtln port 80 -> https://gist.github.com/c21d3a38e1d75fb2c4f1

1 votes

Cela pourrait utiliser plus d'informations. S'agit-il d'un retard constant à chaque nouvelle requête HTTP, ou seulement avec la première requête d'un nouvel hôte ? La durée du retard varie-t-elle beaucoup ? De plus : Si possible, exécutez tcpdump -qtln port 80 et capturez quelques requêtes. Ajoutez les résultats à votre message d'origine. Cela aidera à montrer où se situe le retard au niveau du réseau.

0 votes

Ce retard se produit à chaque demande et prend entre 1.5-3 sec. J'ai ajouté la sortie de tcpdump

0 votes

La sortie de tcpdump ne contient pas d'informations de timing, pourriez-vous plutôt essayer de supprimer l'option t ou de la définir sur tt ou ttttt (5xt) tcpdump -qttln port 80 ou tcpdump -qtttttln port 80?

3voto

peufeu Points 4758

Pour déboguer cela, je isolerais systématiquement chaque composant pour trouver le goulot d'étranglement. À tout moment, je ferais un tail -f de tous les fichiers journaux, y compris les journaux des accès/erreurs de nginx et les journaux des erreurs de rails.

La première question est de savoir s'il est lent uniquement en production, ou aussi en mode développement? La réponse vous aidera à diagnostiquer en vous concentrant sur ce qui est différent entre les environnements.

Démarrez le processus unicorn en mode autonome et connectez-vous sur le port 8080, en éliminant nginx. Est-ce toujours lent? Si oui, c'est soit un problème de rails soit d'Unicorn. Je doute que nginx soit le problème car les ressources statiques sont servies relativement rapidement sur votre site.

Testez l'application avec Webrick pour éliminer Unicorn. S'il est toujours lent, creusez dans votre application rails.

J'ai testé votre site avec telnet ck.uci.agh.edu.pl 80 en faisant un GET http://ck.uci.agh.edu.pl/ et le retard était présent avant l'affichage du texte. Cela élimine tout problème de chargement de javascript ou de ressources dans le navigateur.

Choses à essayer:

  • Testez des composants isolés de votre application dans rails console en effectuant des recherches de modèles. Parcourez chaque composant d'affichage de votre page principale un par un jusqu'à ce que vous trouviez le retard. Essayez d'exécuter le code que vous exécutez dans votre action de contrôleur index, et tout ce que votre page exécute pendant son analyse. Vous recherchez des problèmes de base de données, des retards de connexion à des services externes, etc.

  • Utilisez une période d'essai du service New Relic en mode Pro, qui peut révéler les goulots d'étranglement de l'application tels que des requêtes de base de données lentes ou des appels à des services externes. Il vous montre tout ce qui s'exécute et combien de temps cela prend.

  • Faites une recherche DNS sur la ligne de commande de votre serveur, comme nslookup somehost.com. Parfois, un serveur DNS surchargé peut ralentir votre application si elle utilise des noms d'hôtes dans toutes ses communications avec d'autres serveurs comme votre serveur de base de données, des services de géolocalisation, etc.

  • La seule chose que j'ai vue dans votre configuration était que vous devriez définir votre worker_processes unicorn à au moins le nombre de CPU sur votre serveur. Essayez d'augmenter ce nombre à 4 et voyez si cela aide, mais surveillez l'utilisation de la mémoire.

J'espère que cela vous aidera. Bonne chance!

0 votes

Merci, C'est lent en production et pas en développement, sur Unicorn aussi, mais quand j'ai testé l'application sur Webrick: rails s -e production ce problème ne s'est pas produit. Maintenant, j'essaie de comprendre pourquoi.

0 votes

D'accord, bien - donc vous savez que ce n'est pas simplement le mode production lui-même. Concentrez-vous donc sur chaque composant de vos systèmes de production qui diffèrent du développement. Ensuite, parcourez les composants de l'application comme je l'ai décrit ci-dessus, en utilisant rails c sur le serveur de production lui-même pour trouver le problème.

0 votes

Il semble bien plus rapide maintenant - bien joué. Comment l'avez-vous réparé ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X