2009-09-27 15 views
5

Je dois utiliser Valgrind pour détecter toute violation d'accès à la mémoire effectuée dans une application serveur. Le serveur crée plusieurs threads. Je soupçonne qu'il y a une condition de course qui provoque le crash du serveur toutes les heures environ. Nous avons utilisé Valgrind pour analyser son utilisation de la mémoire, mais la vitesse du processus du serveur a considérablement diminué. La vitesse du serveur a tellement diminué qu'elle était à peine utilisable et aucune condition de course n'était probable.Comment faire fonctionner Valgrind en parallèle avec notre process pour que ses performances ne diminuent pas trop?

Est-il possible de lancer Valgrind en parallèle avec notre application afin de ne pas perdre autant de performance?

Répondre

5

Il convient de noter que Valgrind, tout en prenant en charge les programmes multithread, n'exécutera pas réellement les threads du programme en parallèle si vous avez des cœurs multipolaires disponibles. Il entrelace également les threads à un grain plus fin que le planificateur d'OS natif. Ces deux faits combinés pourraient faire en sorte qu'un programme avec des conditions de course ou d'autres anomalies concurrentes se comportera différemment.

Vous pouvez essayer Helgrind, un outil principalement destiné à détecter la discipline de verrouillage correcte et drd, un outil principalement destiné à détecter les courses de données.

1

Ceci ne répond pas directement à votre question, mais si vous suspectez une erreur de synchronisation, avez-vous essayé d'utiliser l'outil Valgrind Helgrind?

+0

Je n'étais pas au courant de Helgrind auparavant car je ne suis pas un utilisateur professionnel de Valgrind. Je viens d'apprendre à ce sujet aujourd'hui. Je soupçonne qu'un objet est supprimé mais un autre thread essaie d'y accéder et cela bloque le processus. Ceci est hautement probable puisque l'application a été très mal codée. Je vais essayer Helgrind et voir ce qu'il peut offrir. –

9

Vous ne pouvez pas faire cela. Valgrind n'exécute pas votre code de façon native - il l'exécute à l'intérieur d'un simulateur. C'est pourquoi c'est si lent. Donc, il n'y a aucun moyen de le faire tourner plus vite, et toujours bénéficier de Valgrind.

Votre meilleur pari est de définir le ulimit pour que votre programme génère un fichier de base lorsqu'il se bloque. Ensuite, vous pouvez essayer de déterminer quel était le problème en examinant le noyau.

+1

+1, j'étais sur le point de donner une réponse presque identique. –

0

Valgrind fonctionne en s'accrochant à vos appels malloc, vous pouvez donc attendre que votre programme s'exécute plus lentement sous valgrind. Donc, je dirais que vous ne pourriez pas exécuter votre programme plus rapidement sous valgrind et obtenir l'avantage d'analyser les erreurs de mémoire.