2013-11-28 2 views
3

У меня есть однопоточный процесс unix, который обменивается данными с tcp другими процессами.strace fixes hung process

Проблема заключается в следующем. Когда я запускаю процесс, он зависает (нет цикла занятости), пока я не убью его.

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

В чем причина такого поведения? Какое влияние оказывает государство на процесс?

Обновление: Причина, по которой изменилось поведение strace, заключается в том, что мы использовали openonload с ошибкой. Как только мы привязали strace, стек был перенесен обратно в ядро, и проблема исчезла.

+0

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

+0

Правда, но ОП сказал «однопоточное» :) – loreb

+0

У меня такая же ситуация ... зависающий процесс работает хорошо, если я привязываюсь к strace. Может ли кто-нибудь объяснить это объяснение? – ernesto

ответ

0

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

0

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

Тупиковые блоки чаще всего встречаются при многопоточном взаимодействии. Но в вашем случае у вас много процессов. Если strace освобождает процессы каждый раз, то я предполагаю, что вы открываете сокеты или рукопожатие на сокете - это то, что висит. Буферизация и блокировка на сокете, я думаю, может привести вас в состояние, заблокированное процессом.

Похожий вопрос, но с многопоточной процесса, тупиковой между потоками, а не между отдельными процессами: Using strace fixes hung memory issue

Трудно обобщать примеры, особенно не знают, что делают ваши различные процессы или если они как-то распределять ресурсы? Я попробую . , ,

  1. Пример с одним объектом/ресурса, который должен быть защищен:
    Один процесс начинает делать изменения на объекте (например, добавление элементов к списку/таблицы БД)
    Другой процесс начинается итерируя списка/таблицы.
    Опасность одного из тех процессов, в которых цикл итерации путается и никогда не покидает ИЛИ делает что-то хуже, как запись в неверную память.

  2. Пример, где объект/ресурс защищен мьютексами
    Классический простой тупик с двумя проблемами с ресурсами. ~ проще, чем обеденные философы
    Один поток/процесс захватывает мьютексы на объекте A, выполняет некоторую работу.
    Другой поток/процесс захватывает мьютекс на объекте B, выполняет некоторую работу.
    Одной и той же теме/процессу необходимо обновить объект A, ждет мьютекса для A.
    Оригинальная тема/процесс должен получить доступ к объекту B, ждет мьютекса на B.
    . , , , , , , , , , , , @. , , , , , , , , , ,
    Безмолвие, за исключением шума ветра и перекати-поле, дующего по ландшафту.
    Тупик.

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