Что может вызывать тупик или иным образом вызывать непоследовательный сбой этого теста параллелизма? - PullRequest
4 голосов
/ 30 сентября 2010

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

  • Иногда тест проходит
  • Иногда тест не пройден без дальнейшего описания (просто: «Тест не пройден»))
  • Иногда тест завершается неудачно с инструкциями для дублирования *
  • Иногда в тесте будет указано "CHESS обнаружил тупик"

Первоначально я думал, что это несоответствие должно бытьиз-за того, что тестирование предполагает использование Random объектов.Должно быть, разные начальные значения давали разные результаты, верно?

Поэтому я обновил тест, чтобы просто запустить для предопределенного набора начальных значений (от 0 до 10).Локальные по потоку объекты Random засеваются (псевдо) случайным значением, создаваемым общим Random внутри блокировки.Код выглядит в основном точно следующим образом:

Screenshot of CHESS reporting a deadlock

( Обновление : я запускаю это на.NET 3.5, поскольку CHESS поддерживает только VS 2008. Интересно, может ли проблема быть связана с this ?)

Насколько я понимаю, приведенный выше код должен быть довольно детерминированным.Поскольку sharedRandom инициализируется с помощью известного начального числа (от 0 до 10), значения, создаваемые объектом localRandom, принадлежащим каждому потоку, выполняющему код в вызове Parallel.For, должны быть согласованы от одного запуска теста к следующему (какой поток получает, какое начальное число из sharedRandom может отличаться между прогонами, но среди 5 итераций в пределах Parallel.For те же 5 начальных чисел должны использоваться для localRandom).

Вот как I понимаю это.Но из результатов CHESS я склонен полагать, что я что-то упускаю.

  1. Есть ли тупик в приведенном выше коде, который я слишком туп, чтобы видеть?
  2. Разве я не должен использовать класс Random в тестах, связанных с параллелизмом?
  3. Для тех, кто имеет опыт использования CHESS: это надежный инструмент?Это иногда дает ложные срабатывания?На самом деле это большой случай, так как если выяснится, что этот сценарий является распространенным (противоречивые результаты тестов), то, возможно, было бы целесообразно, чтобы я пока вообще отказался от использования CHESS.

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

Ответы [ 2 ]

1 голос
/ 02 октября 2010

Я, конечно, не вижу там тупика.Вероятно, что у Random есть внутренняя блокировка, но это должно быть хорошо.

Возможно, вы захотите попробовать Jinx (www.corensic.com).Вместо создания отчета Jinx просто изменяет эффективную производительность различных процессоров.Так что на самом деле он не может давать ложных срабатываний.

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

Отказ от ответственности.Я работаю на corensic .И я не думаю, что небольшой фрагмент, который вы разместили, действительно зашел в тупик.Но мне любопытно, поэтому дайте нам знать, что вы найдете.

1 голос
/ 30 сентября 2010

Ответов нет, я попробую.Мне не очевидно, как опубликованный фрагмент может потерпеть неудачу, я подозреваю, что настоящая проблема в комментарии.

У меня нет практического опыта работы с CHESS, но я изучил его достаточно хорошо, чтобы понять, что выне могу полагаться на то, что она когда-либо даст вам воспроизводимые результаты испытаний.Этот подход к выявлению проблем с потоками является очень статистическим, вводя случайные задержки в потоках.Предназначен для воссоздания проблем с многопоточностью, на которые так сильно влияет время, особенно условия гонки.

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

Угроза CHESS как инструмент диагностики.Если он поднимает флаг, вы можете быть уверены, что у вас есть реальная, но все еще трудно решаемая, многопоточная проблема.

...