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.