Использование strace исправляет зависшую проблему с памятью
У меня есть многопоточный процесс, работающий на RHEL6.x (64-разрядная версия).
Я обнаружил, что процесс зависает и некоторые потоки (одного и того же процесса) терпят крах большую часть времени, когда я пытаюсь запустить процесс. Некоторые потоки ожидают создания разделяемой памяти между потоками (я вижу, что все это не создается).
Но когда я использую strace, процесс не зависает, и он работает просто отлично (вся память, которая должна быть создана, создается). Даже прерывая процесс после создания памяти, процесс остается нормальным.
Я прочитал это:
Strace исправляет зависший процесс
который дал мне идею. Но мне все еще неясно, так как версия RHEL, которую они использовали, не упоминается.
Кроме того, другой момент заключается в том, что замена ядра на ядро fedora (совместимое) не приводит к возникновению проблемы.
Итак, я просто хотел бы знать, как именно strace влияет на процесс? (или это просто стек, который возвращается к ядру, как указано в ссылке)?
2 ответа
Я пока не могу комментировать, но я видел похожие вещи в прошлой работе. Поскольку на самом деле нет однозначного ответа, я собираюсь пойти на это:
Каковы шансы, что вы вступаете в тупик между потоками из-за проблем с синхронизацией, которые "решаются" путем замедления выполнения программы?
Что произойдет, если вы выполните отладку в процессе, а не в strace?
Наиболее вероятная причина в том, что , который перехватывает системные вызовы с помощьюptrace
средство, влияет на время выполнения вашего приложения из-за накладных расходов на каждый системный вызов.
Рассмотрим сценарий с двумя потоками, запущенными параллельно, где поток A инициализирует глобальную переменную, а поток B обращается к этой переменной без какой-либо синхронизации потоков. Поток B вызывает ошибку сегментации всякий раз, когда потоку A не удается инициализировать переменную до того, как поток B получит к ней доступ.
Однако если поток B взаимодействует с ОС (посредством системных вызовов) перед доступом к переменной, это может привести к задержке, которой может быть достаточно, чтобы дать потоку B время для инициализации переменной. И наоборот, если поток A взаимодействует с ОС перед инициализацией переменной,strace
может сделать ошибку сегментации более вероятной из-за задержки инициализации.
Аналогичным образом, различные реализации ядра могут влиять на время, воспринимаемое процессами пользовательского пространства, и могут привести к сбою приложения с условиями гонки, даже если ядро не является основной причиной сбоя, а является только триггером.