Conseils pour maximiser les requêtes Nginx / s?

15

Je crée un package d'analyse et les exigences du projet indiquent que je dois prendre en charge 1 milliard de visites par jour. Oui, "milliards". En d'autres termes, pas moins de 12 000 coups par seconde soutenus, et de préférence de l'espace pour éclater. Je sais que j'aurai besoin de plusieurs serveurs pour cela, mais j'essaie d'obtenir des performances maximales de chaque nœud avant de "lancer plus de matériel".

À l'heure actuelle, la partie de suivi des hits est terminée et bien optimisée. Je sauvegarde à peu près les demandes directement dans Redis (pour un traitement ultérieur avec Hadoop). L'application est Python / Django avec un gunicorn pour la passerelle.

Mon serveur Rackspace Ubuntu 10.04 de 2 Go (pas une machine de production) peut servir environ 1 200 fichiers statiques par seconde (comparé à l'aide d'Apache AB par rapport à un seul actif statique). Pour comparer, si j'échange le lien de fichier statique avec mon lien de suivi, j'obtiens toujours environ 600 requêtes par seconde - je pense que cela signifie que mon tracker est bien optimisé, car il n'est que 2 fois plus lent que de servir le même actif statique à plusieurs reprises.

Cependant, lorsque je compare avec des millions de hits, je remarque quelques choses -

  1. Aucune utilisation du disque - cela est prévu, car j'ai désactivé tous les journaux Nginx et mon code personnalisé ne fait rien d'autre que d'enregistrer les détails de la demande dans Redis.
  2. Utilisation de la mémoire non constante - Probablement en raison de la gestion de la mémoire de Redis, mon utilisation de la mémoire augmentera progressivement puis diminuera, mais ce n'est jamais une fois mon goulot d'étranglement.
  3. La charge du système oscille autour de 2 à 4, le système est toujours réactif même lors de mes tests les plus lourds, et je peux toujours afficher manuellement http://mysite.com/tracking/pixel avec peu de retard visible pendant que mon (autre) serveur exécute 600 requêtes par seconde.
  4. Si je lance un court test, disons 50 000 coups (environ 2 m), j'obtiens 600 requêtes stables et fiables par seconde. Si je lance un test plus long (essayé jusqu'à 3,5 m jusqu'à présent), mon r / s se dégrade à environ 250.

Mes questions --

une. Semble-t-il que j'utilise encore ce serveur au maximum? Les performances nginx des fichiers statiques à 1 200 / s sont-elles comparables à celles des autres utilisateurs?

b. Existe-t-il des réglages Nginx courants pour ces applications à volume élevé? J'ai des threads de travail définis sur 64 et des threads de travail de gunicorn sur 8, mais le réglage de ces valeurs ne semble pas m'aider ou me nuire beaucoup.

c. Existe-t-il des paramètres de niveau Linux qui pourraient limiter mes connexions entrantes?

ré. Qu'est-ce qui pourrait faire dégrader mes performances à 250r / s lors de tests de longue durée? Encore une fois, la mémoire n'est pas au maximum pendant ces tests et l'utilisation du disque dur est nulle.

Merci d'avance, tout :)

EDIT Voici ma configuration nginx - http://pastie.org/1450749 - c'est principalement de la vanille, avec de la graisse évidente parée.

lié
la source
Vous posez plusieurs questions dans un seul message, pensez à réviser. Je fais juste un commentaire et non une réponse, car je ne peux pas répondre à toutes les parties. Je suppose que vous avez considéré les performances Python / Django - ce n'est pas idéal pour une vitesse extrême. En ce qui concerne 1200 req / s, cela semble très très faible pour ce que je suppose être une réponse gif 1px ou HTTP 204. Voir fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world (24k req / s, fonctionnant sur localhost, mais utilisant seulement 1 nginx worker.)
Jesper M
Commentaire Goldmine, merci beaucoup. Je vais lire le post et revenir avec mes conclusions; merci pour le pointeur "questions multiples"!
Linkedlinked

Réponses:

8

Vous abusez de worker_threads de Nginx. Il n'est absolument pas nécessaire de diriger autant de travailleurs. Vous devez exécuter autant de travailleurs que vous avez de CPU et l'appeler un jour. Si vous exécutez gunicorn sur le même serveur, vous devriez probablement limiter les travailleurs nginx à deux. Sinon, vous allez juste battre les processeurs avec tout le changement de contexte requis pour gérer tous ces processus.

blueben
la source
1
Ah merci. Les performances semblaient à peu près les mêmes avec 64 qu'avec 2, mais je savais que WTF ne le faisait pas. Merci de clarifier.
lié le
Pouvez-vous partager votre configuration Nginx? Il est difficile de fournir des conseils de réglage lorsque nous ne savons pas ce que nous réglons.
blueben
2

J'ai utilisé nginx pour servir 5K demander une seconde pour le contenu statique. Vous pouvez augmenter le nombre de connexions_ouvriers actuellement définies à 1024.

Le calcul max_client serait le suivant.

Les ouvriers_connexions et ouvriers_procèses de la section principale vous permettent de calculer la valeur maxclients:

max_clients = worker_processes * worker_connections

Dans une situation de proxy inverse, max_clients devient

max_clients = worker_processes * worker_connections / 4

http://wiki.nginx.org/EventsModule#worker_connections

Le calcul du nombre maximal de connexions de travail est facile une fois que vous connaissez la capacité de votre configuration. La capacité totale / nombre de cœurs correspond au nombre maximal de connexions de travail. Pour calculer la capacité totale, il existe plusieurs façons.

  1. Je vous suggère d'essayer de comparer votre configuration qui vous donnera les chiffres les plus réalistes. Vous pouvez utiliser des outils tels que siège, pummel, banc Apache, etc., n'oubliez pas de mesurer l'utilisation des ressources système pendant le test.

Si vous la méthode ci-dessus ne fonctionne pas pour vous, essayez les méthodes ci-dessous. Je fais des hypothèses générales en ignorant la RAM et les E / S, elles seront également prises en compte, mais elles vous donneront des points de départ et vous pourrez effectuer des ajustements à partir de là.

  1. En supposant que la bande passante est le goulot d'étranglement, prenez la taille moyenne de l'objet que nginx sert et divisez votre bande passante avec cela et vous obtiendrez le qps maximum pris en charge.

  2. Dans la deuxième hypothèse, le CPU est le goulot d'étranglement. Dans ce cas, mesurez le temps de demande et divisez 1 par celui-ci et multipliez par le nombre de cœurs dans votre système. Cela donnera le nombre de requêtes par seconde que nginx peut gérer.

Sameer
la source
Comment faut-il déterminer si vous pouvez augmenter les connexions ouvrières et quel est le paramètre idéal pour un serveur donné?
Kato
Il y a deux façons de procéder.
Sameer