Использование strace исправляет зависшую проблему с памятью

У меня есть многопоточный процесс, работающий на RHEL6.x (64-разрядная версия).

Я обнаружил, что процесс зависает и некоторые потоки (одного и того же процесса) терпят крах большую часть времени, когда я пытаюсь запустить процесс. Некоторые потоки ожидают создания разделяемой памяти между потоками (я вижу, что все это не создается).

Но когда я использую strace, процесс не зависает, и он работает просто отлично (вся память, которая должна быть создана, создается). Даже прерывая процесс после создания памяти, процесс остается нормальным.

Я прочитал это:

Strace исправляет зависший процесс

который дал мне идею. Но мне все еще неясно, так как версия RHEL, которую они использовали, не упоминается.

Кроме того, другой момент заключается в том, что замена ядра на ядро ​​fedora (совместимое) не приводит к возникновению проблемы.

Итак, я просто хотел бы знать, как именно strace влияет на процесс? (или это просто стек, который возвращается к ядру, как указано в ссылке)?

2 ответа

Я пока не могу комментировать, но я видел похожие вещи в прошлой работе. Поскольку на самом деле нет однозначного ответа, я собираюсь пойти на это:

Каковы шансы, что вы вступаете в тупик между потоками из-за проблем с синхронизацией, которые "решаются" путем замедления выполнения программы?

Что произойдет, если вы выполните отладку в процессе, а не в strace?

Наиболее вероятная причина в том, что , который перехватывает системные вызовы с помощьюptraceсредство, влияет на время выполнения вашего приложения из-за накладных расходов на каждый системный вызов.

Рассмотрим сценарий с двумя потоками, запущенными параллельно, где поток A инициализирует глобальную переменную, а поток B обращается к этой переменной без какой-либо синхронизации потоков. Поток B вызывает ошибку сегментации всякий раз, когда потоку A не удается инициализировать переменную до того, как поток B получит к ней доступ.

Однако если поток B взаимодействует с ОС (посредством системных вызовов) перед доступом к переменной, это может привести к задержке, которой может быть достаточно, чтобы дать потоку B время для инициализации переменной. И наоборот, если поток A взаимодействует с ОС перед инициализацией переменной,straceможет сделать ошибку сегментации более вероятной из-за задержки инициализации.

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

Другие вопросы по тегам