Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Визуализатор параллелизма помогает разработчикам визуализировать поведение многопоточного приложения. Это средство включает в себя коллекцию распространенных шаблонов для многопоточных приложений, которые ведут себя плохо. Коллекция включает типичные и узнаваемые визуальные шаблоны, предоставляемые с помощью средства, вместе с объяснением поведения, представленного каждым шаблоном, вероятным результатом этого поведения и наиболее распространенным подходом для ее устранения.
Блокировка конфликтов и сериализованное выполнение
Иногда параллельное приложение упорно продолжает выполняться последовательно, даже если у него есть несколько потоков, и компьютер имеет достаточное количество логических ядер. Первым симптомом является плохая производительность многопоточности, возможно, даже немного медленнее, чем при последовательной реализации. В представлении потоков не отображается несколько потоков, выполняемых параллельно; Вместо этого вы видите, что в любое время выполняется только один поток. На этом этапе, если щелкнуть сегмент синхронизации в потоке, можно увидеть стек вызовов для заблокированного потока (блокирующий стек вызовов) и поток, который удалил условие блокировки (разблокировка стека вызовов). Кроме того, если стек вызовов для разблокировки возникает в процессе, который вы анализируете, отображается соединитель Thread-Ready. С этого момента вы можете перейти к анализу кода из блокирующих и разблокирующих стеков вызовов, чтобы более подробно изучить причину сериализации.
Как показано на следующем рисунке, Средство визуализации параллелизма также может демонстрировать этот симптом в представлении использования центрального процессора, где, несмотря на наличие нескольких потоков, приложение использует только один логический процессор.
Дополнительные сведения см. в разделе "Начало работы с проблемой" статьи MSDN Magazine Thread Performance — Resource Contention Concurrency Profiling in Visual Studio.
Неравномерное распределение рабочей нагрузки
Когда в приложении происходит нерегулярное распределение работы между несколькими параллельными потоками, появляется типичный ступенчатый шаблон по мере завершения работы каждым потоком, как показано на предыдущем рисунке. Визуализатор параллелизма чаще всего показывает очень близкое время начала для каждого параллельного потока. Однако эти потоки, как правило, заканчиваются неравномерно, а не одновременно. Этот шаблон указывает на нерегулярное распределение работы между группой параллельных потоков, что может привести к снижению производительности. Лучший подход к такой проблеме заключается в повторном вычислении алгоритма, по которому работа была разделена между параллельными потоками.
Как показано на следующем рисунке, визуализатор параллелизма также может отображать этот симптом в представлении использования ЦП как постепенное снижение использования ЦП.
Превышение лимита подписки
В случае переполнения число активных потоков в процессе превышает количество доступных логических ядер в системе. На предыдущем рисунке показаны результаты переподписки с значительной степенью вытеснения во всех активных потоках. Кроме того, легенда показывает, что в этом примере большое количество времени затрачивается на вытеснение (84 процента). Это может указывать на то, что процесс просит систему выполнять более параллельные потоки, чем количество логических ядер. Однако это также может указывать на то, что другие процессы в системе используют ресурсы, которые, как предполагается, будут доступны для этого процесса.
При оценке этой проблемы следует учитывать следующее:
Общая система может быть перегружена. Имейте в виду, что другие процессы в системе могут перехватывать ваши потоки. При наведении указателя на сегмент прерывания в представлении потоков всплывающая подсказка определит поток и процесс, которые прервали поток. Этот процесс не обязательно выполнялся всё время, пока ваш процесс был вытеснен, но он даёт представление о том, что создало давление вытеснения относительно вашего процесса.
Оцените, как ваш процесс определяет соответствующее количество потоков для выполнения на этом этапе работы. Если процесс напрямую вычисляет количество активных параллельных потоков, попробуйте изменить этот алгоритм, чтобы лучше учитывать количество доступных логических ядер в системе. Если вы используете среду выполнения параллелизма, библиотеку параллельных задач или PLINQ, эти библиотеки выполняют вычисление количества потоков.
Неэффективный ввод-вывод
Чрезмерное использование или неправильное использование операций ввода-вывода является распространенной причиной неэффективности в приложениях. Рассмотрим предыдущую иллюстрацию. Профиль видимой временной шкалы показывает, что 44 процента времени видимого потока потребляется операцией ввода-вывода. На временной шкале отображаются большие объемы операций ввода-вывода, что означает, что профилированное приложение часто блокируется операциями ввода-вывода. Чтобы просмотреть сведения о типах операций ввода-вывода и о том, где программа заблокирована, увеличьте масштаб проблемных регионов, просмотрите профиль видимой временной шкалы и выберите конкретный блок ввода-вывода, чтобы просмотреть текущие стеки вызовов.
Блокировка конвоев
Блокировки конвоев возникают, когда приложение получает блокировки в порядке живой очереди, и когда скорость прибытия на блокировку выше, чем скорость снятия блокировки. Сочетание этих двух условий приводит к тому, что запросы на блокировку начинают накапливаться. Одним из способов борьбы с этой проблемой является использование "несправедливых" блокировок или блокировок, которые дают доступ к первому потоку, чтобы найти их в разблокированных состояниях. На предыдущем рисунке показано поведение конвоя. Чтобы устранить проблему, попробуйте уменьшить конкуренцию за объекты синхронизации, и попробуйте использовать несправедливые блокировки.