2009-09-27 17 views
5

Ich muss Valgrind verwenden, um Speicherzugriffsverletzungen in einer Serveranwendung zu erkennen. Der Server erstellt viele Threads. Ich vermute, dass es eine Rennsituation gibt, die den Server alle 1 Stunde zum Absturz bringt. Wir haben Valgrind verwendet, um seine Speichernutzung zu analysieren, aber die Geschwindigkeit des Serverprozesses nahm drastisch ab. Die Geschwindigkeit des Servers ging so stark zurück, dass er kaum noch benutzbar war und keine Rennbedingungen wahrscheinlich waren.Wie läuft Valgrind parallel zu unserem Prozess, damit seine Leistung nicht zu stark abnimmt?

Gibt es trotzdem Valgrind parallel zu unserer Anwendung, damit wir nicht so viel Leistung verlieren?

Antwort

5

Es ist erwähnenswert, dass Valgrind, während Multi-Threaded-Programme unterstützt, nicht tatsächlich die Threads des Programms parallel laufen, wenn Sie mehrere Kerne verfügbar haben. Es verschachtelt auch Threads mit einer feineren Körnung als der native OS-Scheduler. Diese zwei Faktoren zusammen können dazu führen, dass sich ein Programm mit Rennbedingungen oder anderen gleichzeitigen Anomalien anders verhält.

Sie können versuchen, , ein Werkzeug in erster Linie zur Erkennung der richtigen Sperrdisziplin und drd, ein Tool in erster Linie zur Erkennung von Datenrennen gerichtet versuchen.

1

Dies beantwortet Ihre Frage nicht direkt, aber wenn Sie einen Synchronisierungsfehler vermuten, haben Sie versucht, das Valgrind-Tool Helgrind zu verwenden?

+0

Mir war Helgrind vorher nicht bekannt, da ich kein professioneller Valgrind-Benutzer bin. Ich habe es gerade erst erfahren. Ich vermute, dass ein Objekt gelöscht wird, aber ein anderer Thread versucht, darauf zuzugreifen, und das stürzt den Prozess ab. Dies ist sehr wahrscheinlich, da die Anwendung sehr schlecht codiert wurde. Ich werde Helgrind versuchen und sehen, was es bieten kann. –

9

Sie können das nicht tun. Valgrind führt Ihren Code nicht nativ aus - stattdessen wird er in einem Simulator ausgeführt. Deshalb ist es so langsam. Also, es gibt keine Möglichkeit, es schneller laufen zu lassen und immer noch den Vorteil von Valgrind zu bekommen.

Am besten stellen Sie die ulimit so ein, dass Ihr Programm beim Absturz eine Core-Datei generiert. Dann können Sie versuchen, herauszufinden, was das Problem war, indem Sie den Kern untersuchen.

+1

+1, wollte ich eine fast identische Antwort geben. –

0

Valgrind funktioniert, indem es sich in Ihre malloc-Aufrufe einklinkt, so dass Sie erwarten können, dass Ihr Programm unter valgrind langsamer läuft. Also würde ich sagen, dass Sie Ihr Programm nicht schneller unter valgrind und den Vorteil der Analyse von Speicherfehlern bekommen können.