2012-08-30 5 views
7

У меня есть программа, которая принимает данные из сокета, выполняет некоторые контроля качества и сортирует другие настройки, а затем записывает их в именованный канал. Я побежал на нее и исправил все утечки памяти, которые изначально существовали. Затем я создал среду «demo» в системе, в которой у меня было 32 экземпляра этой программы, каждый из которых подавал уникальные данные и каждый из них выводил на свой собственный канал. Мы протестировали его, и все было в порядке. Затем я попытался провести стресс-тестирование, повысив скорость передачи данных до абсурдной скорости, и сначала все было хорошо, но мои программы продолжали потреблять все больше и больше памяти, пока у меня не осталось ресурсов.как выследить память утечки valgrind говорит не существует?

Я повернулся к valgrind и выполнил ту же самую настройку, за исключением каждой программы, выполняющейся внутри valgrind, с помощью проверки утечки = полной. Несколько странных вещей произошло. Во-первых, память протекала, но только до того момента, когда каждая программа потребляла 0,9% моей памяти (ранее наибольший объем памяти имел полные 6% моей памяти). Когда valgrind запускал стоимость процессора для программ, и теперь я был на 100% -ном процессоре с огромным средним значением нагрузки, поэтому возможно отсутствие доступного процессора заставляло все программы работать достаточно медленно, чтобы утечка слишком долго проявлялась , Когда я попытался остановить эти программы, valgrind не обнаружил прямых утечек памяти, он показал некоторые потенциальные утечки памяти, но я проверил их, и я не думаю, что любой из них представляет собой реальные утечки памяти; и, кроме того, возможная утечка памяти проявлялась только в несколько килобайт, в то время как программа потребляла более 100 МБ. Досягаемая (не утечка) память, сообщаемая valgrind, также была в диапазоне KB, поэтому valgrind, похоже, полагает, что мои программы потребляют часть памяти, которую Top говорит, что они используют.

Я провел несколько других тестов и получил нечетные результаты. Одна программа, даже работающая в три раза быстрее, чем моя первоначальная утечка памяти, была обнаружена, никогда, кажется, не потребляет более 0,9% памяти, две программы протекают до 1,9 и 1,3% памяти соответственно, но не более и т. Д., Это как если бы количество утечки памяти и скорость ее утечки каким-то образом зависят от того, сколько экземпляров моей программы запущено за один раз; что не имеет смысла, каждый экземпляр должен быть на 100% независим от других.

Я также обнаружил, что если я запускаю 32 экземпляра, только один экземпляр, запущенный в valgrind, экземпляр valgrinded (это слово, если я говорю это!) Утечки памяти, но медленнее, чем те, которые работают за пределами valgrind. Экземпляр valgrind все равно скажет, что у меня нет прямых утечек и отчетов гораздо меньше потребления памяти, чем Top показывает.

Я довольно тупик относительно того, что может вызвать этот результат, и почему valgrind отказывается осознавать утечку памяти. Я думал, что это может быть внешняя библиотека, но я действительно не использую никаких внешних библиотек; просто базовые функции/объекты C++. Я также подумал, что это могут быть данные, записанные в выходной канал, чтобы быстро заставлять буфер расти неограниченно, но 1) должен быть верхний предел, который может иметь такой буфер, и 2) как только память была просочилась, если я удалю данные скорость ввода до нуля, память остается потребляемой, а затем медленно возвращается к разумной сумме.

Может ли кто-нибудь дать мне подсказку, где я должен смотреть отсюда? Я полностью в тупике, почему память ведет себя так.

Спасибо.

+2

Вы уверены, что это утечка, а не какая-то часть вашего программирования, собирающая память? ты пробовал массив? – PlasmaHH

+0

Я сам сталкивался с подобными проблемами (хотя и не так изворотливый), и меня очень интересует любая обратная связь. Одно из предложений: не могли бы вы уточнить OS/версию, которую используете? Я предполагаю, что это Linux-дистрибутив. –

+0

Valgrind запускает вашу программу в песочнице и выполняет огромную обработку. Вы должны ожидать, что он будет иметь гораздо более высокий уровень использования ЦП и намного более медленную производительность, чем тот же самый прикладной процесс, который исходит из valgrind. Я бы подумал, будет ли во время стресс-тестирования программа создавать дополнительные буферы для хранения данных, которые не могут попасть в трубу, и которые растут (не просачиваются, просто растут, так как вы не можете поддерживать темп). –

ответ

1

Это звучит как проблема, с которой я недавно сталкивался.

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

Чем больше экземпляров программы вы запускаете, тем медленнее будет проходить каждый экземпляр, и чем быстрее будут увеличиваться буферы.

Это может быть или не быть вашей проблемой, но без дополнительной информации это лучшее, что я могу сделать.

+0

Это была самая близкая к точной. Я должен был выводить данные один раз каждые х секунд (confugred от конфигурационного файла). Но из-за ошибки счетчик, который хранил мое время таймаута, постепенно увеличивался при запуске, поэтому я сохранял минута + данных. Дополнительное напряжение в системе вызвало ошибку, которая увеличивала мой счетчик тайм-аута чаще всего при запуске. Я хотел бы поблагодарить Плазму за упоминание массива, который поставил меня в правильном направлении. Я думал, что memcheck рассказывал мне, что памяти не так много, поэтому я не смотрел на использование внутренней памяти; Я совершенно неправильно читал memcheck. – dsollen

2

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

1

Могу ли я предложить вам попробовать MemoryScape? Этот инструмент отлично справляется с обнаружением утечки памяти. Это не бесплатно, но учитывая потраченное время и энергию, стоит попробовать.

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

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