У меня есть программа, которая принимает данные из сокета, выполняет некоторые контроля качества и сортирует другие настройки, а затем записывает их в именованный канал. Я побежал на нее и исправил все утечки памяти, которые изначально существовали. Затем я создал среду «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) как только память была просочилась, если я удалю данные скорость ввода до нуля, память остается потребляемой, а затем медленно возвращается к разумной сумме.
Может ли кто-нибудь дать мне подсказку, где я должен смотреть отсюда? Я полностью в тупике, почему память ведет себя так.
Спасибо.
Вы уверены, что это утечка, а не какая-то часть вашего программирования, собирающая память? ты пробовал массив? – PlasmaHH
Я сам сталкивался с подобными проблемами (хотя и не так изворотливый), и меня очень интересует любая обратная связь. Одно из предложений: не могли бы вы уточнить OS/версию, которую используете? Я предполагаю, что это Linux-дистрибутив. –
Valgrind запускает вашу программу в песочнице и выполняет огромную обработку. Вы должны ожидать, что он будет иметь гораздо более высокий уровень использования ЦП и намного более медленную производительность, чем тот же самый прикладной процесс, который исходит из valgrind. Я бы подумал, будет ли во время стресс-тестирования программа создавать дополнительные буферы для хранения данных, которые не могут попасть в трубу, и которые растут (не просачиваются, просто растут, так как вы не можете поддерживать темп). –