2009-09-27 4 views
5

Мне нужно использовать Valgrind для обнаружения нарушений доступа к памяти, выполняемых в серверном приложении. Сервер создает много потоков. Я подозреваю, что существует гоночное состояние, которое приводит к сбою сервера каждые 1 час или около того. Мы использовали Valgrind для анализа использования памяти, но скорость процесса сервера резко снизилась. Скорость сервера уменьшилась настолько, что она вряд ли пригодна для использования, и никаких вероятных гоночных условий.Как запустить Valgrind параллельно с нашим процессом, чтобы его производительность не уменьшалась слишком сильно?

Есть ли способ запустить Valgrind параллельно с нашим приложением, чтобы мы не потеряли столько производительности?

ответ

5

Следует отметить, что Valgrind, поддерживая многопоточные программы, фактически не будет запускать потоки программы параллельно, если у вас есть многоядерные ядра. Он также чередует потоки с более тонким зерном, чем собственный планировщик ОС. Эти объединенные 2 факта могут сделать так, чтобы программа с условиями гонки или другими параллельными аномалиями вела себя по-другому.

Возможно, вы захотите попробовать Helgrind, инструмент, предназначенный прежде всего для обнаружения правильной блокирующей дисциплины и drd, инструмент, предназначенный в первую очередь для обнаружения гонок данных.

1

Это не отвечает непосредственно на ваш вопрос, но если вы подозреваете ошибку синхронизации, попробовали ли вы использовать инструмент Valgrind Helgrind?

+0

Я раньше не знал об этом, потому что я не профессиональный пользователь Valgrind. Я только что узнал об этом сегодня. Я подозреваю, что объект удаляется, но другой поток пытается получить к нему доступ, и это приводит к сбою процесса. Это очень вероятно, так как приложение было закодировано очень плохо. Я попробую Хелгринда и посмотрю, что он может предложить. –

9

Вы не можете этого сделать. Valgrind фактически не выполняет ваш код изначально - вместо этого он запускает его внутри симулятора. Вот почему это так медленно. Таким образом, нет никакого способа заставить его работать быстрее и все еще пользоваться преимуществами Valgrind.

Ваш лучший выбор - установить ulimit так, чтобы ваша программа генерировала основной файл при его сбое. Тогда вы можете попытаться выяснить, в чем проблема, исследуя ядро.

+1

+1, я собирался дать почти идентичный ответ. –

0

Valgrind работает, подключаясь к вашим вызовам malloc, поэтому вы можете ожидать, что ваша программа будет работать медленнее под valgrind. Итак, я бы сказал, что вы не могли быстрее запускать свою программу под valgrind и получить преимущество анализа ошибок памяти.

 Смежные вопросы

  • Нет связанных вопросов^_^