2009-10-04 5 views
17

J'ai une application serveur écrite en C++ et déployée dans Cent OS. Je n'ai écrit aucune partie de son code mais j'ai besoin d'optimiser ses performances. Ses performances actuelles sont acceptables pour un petit nombre d'utilisateurs, mais lorsque le nombre d'utilisateurs augmente les performances du serveur diminue considérablement.Comment trouver les goulots d'étranglement de performance dans le code C++

Existe-t-il des outils, techniques ou meilleures pratiques pour identifier les goulots d'étranglement?

Répondre

14

Les personnes utilisent généralement des profileurs pour déterminer les goulets d'étranglement des performances. Les questions SO précédentes demandant des profileurs C++ sont here et here (en fonction du système d'exploitation et du compilateur que vous utilisez). Pour Linux, les gens utilisent généralement gprof, juste parce qu'il vient avec le système.

+0

Les profileurs sont parfaits - mais ne conviennent manifestement pas à un système de production - vous devez d'abord reproduire le problème sur un système hors production. – MarkR

+3

En fait, vous n'avez pas besoin de voir le problème sur le système de développement. Au lieu de cela, le profileur peut vous dire qu'une partie importante du temps d'exécution est dépensée même si vous ne reconnaissez pas cela comme étant "long". Bien sûr, il y a d'autres problèmes (par exemple avec les performances de la base de données) où le profilage de l'application n'aidera pas. –

3

Vous allez commencer par la construction d'un environnement de test de performances si vous ne l'avez pas

  • matériel de production de qualité. Si vous n'avez pas le budget pour cela, vous pouvez aussi abandonner.
  • Programme (s) de pilote ou dispositifs matériels qui lancent un trafic de production à un débit élevé - aussi vite ou plus vite que la production. Selon votre protocole et votre utilisation, cela peut être facile ou difficile. Une technique consiste à échantillonner certaines requêtes de la production et à les rejouer, mais cela peut donner des résultats irréalistes car cela augmentera les taux de réussite du cache.
  • infrastructures environnantes comme similaires à la production que vous pouvez raisonnablement obtenir

reproduisons ensuite le problème, tel qu'il existe dans la production. Une fois que vous avez fait cela, utilisez un profileur, etc., comme d'autres l'ont suggéré.

+0

+1 Bons commentaires sur la façon de reproduire le problème de performance. –

1

J'aime, la réponse de mike Dunlavey ci-dessus (si légère hausse de son si vous la mienne légère hausse)

Je voudrais élaborer quelqu'un pressé avec deux méthodes:

  • Un moyen rapide pour gcc les utilisateurs à l'échantillon dans ce gstack
  • l'auto-inspection avec SIGALRM combiné avec backtrace (conduit par votre propre t imer).

Il y a tout juste quelques jours, je l'ai fait quelque chose comme ça

# while true; do gstack $MYPID; sleep 2; done | logger $PARAMS 

utilisant PARAM qui vont avec mes règles de routage syslog afin que mes journaux d'applications ont été entremêlées avec des piles (pas un LINE- parfait avec les événements)

les résultats étaient sur le nez, ils me ont souligné dans une zone que je pensais que pourrait être un problème du tout, mais était mon goulot d'étranglement en raison de misuse of reference in a tr1::bind

Dans la méthode d'alarme, faites attention à ce que vous faites dans le signal, n'utilisez rien qui alloue de la mémoire (pas de cout/cerr/boost, et n'utilisez que des formats simples (c.-à-d. "% 08X" avec printf)

Questions connexes