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 -
- 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.
- 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.
- 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.
- 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.
Réponses:
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.
la source
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.
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à.
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.
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.
la source