C# код очень медленно с прикрепленным отладчиком; Ошибка памяти
-
27-10-2019 - |
Вопрос
У меня есть приложение клиента/сервера. Компонент сервера запускается, использует WCF в «удаленной» моде (двоичный формат, объекты сеанса).
Если я запускаю компонент сервера и запустим клиент, первая задача, которую сервер выполняет в <0,5SEC.
Если я запускаю компонент сервера с прикрепленным отладчиком VS, а затем запустите клиент, задача занимает более 20 секунд.
Нет никаких изменений кода - нет никаких изменений в компиляции. То же самое происходит, есть ли у меня компонент сервера, скомпилированным и работающим в 32-разрядном 64-битном, с процессом хостинга VS, без процесса хостинга VS или любой комбинации этих вещей.
Возможно важно: Если я использую vs.net Профилировщик (Режим отбора проб), тогда приложение работает так быстро, как если бы не было приложено отладчика. Так что я не могу диагностировать это таким образом. Только что проверял режим инструментов также работает быстро. То же самое для режима профилирования параллелизма, работает быстро.
Ключевые данные:
- Приложение использует довольно тяжелые многопоточные чтения (40 потоков в бассейне стандартных потоков). Создание потоков происходит быстро и не является медленной точкой. Есть много замков,
WaitHandle
песокMonitor
узоры - Приложение вообще не поднимает никаких исключений.
- Приложение не создает вывода консоли.
- Приложение является полностью управляемым кодом.
- Приложение сочетает в себе несколько файлов на диске с Memory Mamemarfile: 1x750MB и 12x8MB и несколько меньших.
Измеренная производительность:
- Использование процессора минимально в обоих случаях; Когда отладчик прикреплен, ЦП находится на уровне <1%
- Использование памяти минимально в обоих случаях; Может быть, 50 или 60 МБ в обоих случаях
- Происходит много разломов страниц (Ref MMF), однако они происходят медленнее, когда отладчик прикреплен
- Если процесс хостинга VS не используется, или в основном вступает в игру «монитор удаленной отладки», тогда что Использует процессор приличной суммы и создает большое количество разломов страниц. Но это не единственный раз, когда возникает проблема
- Разница в производительности наблюдается независимо от того, как запускается клиент. Единственная изменяемая переменная - это компонент сервера, который запускается с помощью «запуска с отладки» против запуска от Explorer.
Мои идеи:
- WCF медленно при отладке?
- MemoryMappedfiles медленно при отладке?
- 40 используемых потоков - медленно отладки? Возможно, мониторы/замки уведомляют отладчик? Планирование потоков становится странным/контекстным переключателем очень нечасто?
- Космическое фоновое излучение, предоставляя интеллект и жестокое чувство юмора VS
Все кажутся глупо маловероятными.
Итак, мои вопросы:
- Почему это происходит?
- Если #1 неизвестно, как я могу диагностировать / узнать?
Решение
Исключения могут особенно повлиять на производительность приложения. Существует два типа исключений: 1 -й шанс исключения (один из изящно обрабатывается с помощью блока Try/catch) и невозможных исключений (которые в конечном итоге будут разрушать приложение).
По умолчанию отладчик не показывает исключения из 1 -го шанса, он просто показывает непрерывные исключения. И по умолчанию это также показывает только исключения, возникающие в вашем коде. Однако, даже если он не показывает их, он все еще обрабатывает их, поэтому его производительность может быть затронута (особенно в испытаниях нагрузки или больших циклов).
Чтобы включить 1 -е шанс исключения отображения в Visual Studio, нажмите на «Debug | Exceptions», чтобы вызвать диалоговое окно исключения, и проверьте «брошенные» в разделе «Общий язык выполнения» (вы можете быть более конкретны увидеть).
Чтобы включить 1 -й шанс исключения отображаются из любой точки приложения, а не только из вашего кода, нажмите «Инструменты | Параметры | Отладка | Общие» и отключите опцию «Включить только мой код».
И для этих конкретных случаев «режима криминалистики» я также настоятельно рекомендую включить шаг .NET Framework источник (необходимо «включить только мой код» отключить). Очень полезно понять, что происходит, иногда просто смотреть на стек вызовов очень вдохновляет - и полезно, особенно в случае с космическим радиационным микшированием :-)
Две связанные интересные статьи:
Другие советы
Поскольку это один из первых результатов, когда я Googling для этой проблемы я хотел бы добавить свое решение здесь в надежде сэкономить кому -то 2 часа исследования, как в моем случае.
Мой код замедлился с 30 секунд без отладчика, прикрепленного к 4 минутам с отладчиком. Потому что я забыл удалить условную точку останова. Кажется, они сильно замедляют исполнение, так что следите за этим