У меня есть приложение клиент / сервер. Серверный компонент работает, использует WCF в режиме «удаленного взаимодействия» (двоичный форматер, объекты сеанса).
Если я запускаю серверный компонент и запускаю клиент, первая задача, которую сервер выполняет, завершается за <0,5 с. </p>
Если я запускаю серверный компонент с подключенным отладчиком VS, а затем запускаю клиент, выполнение задачи занимает более 20 секунд.
Нет изменений кода - нет изменений условной компиляции. То же самое происходит, если у меня серверный компонент скомпилирован и запущен в 32-битном, 64-битном режиме с процессом размещения VS, без процесса размещения VS, или с какой-либо комбинацией этих вещей.
Возможно, важно : если я использую VS.NET profiler (режим выборки), то приложение запускается так быстро, как если бы не было отладчика. Поэтому я не могу диагностировать это таким образом. Только что проверил, режим КИП также работает быстро. То же самое для режима профилирования параллелизма, работает быстро.
Ключевые данные:
- Приложение использует довольно интенсивную многопоточность (40 потоков в стандартном пуле потоков). Создание потоков происходит быстро независимо и не является медленной точкой. Есть много замков,
WaitHandle
с и Monitor
узоров
- Приложение вообще не вызывает исключений.
- Приложение не создает вывод консоли.
- Приложение полностью управляется кодом.
- Приложение отображает несколько файлов на диске в MemoryMappedFile: 1x750MB и 12x8MB и несколько меньших
Измеренная производительность:
- Использование ЦП минимально в обоих случаях; когда отладчик подключен, загрузка процессора составляет <1% </li>
- Использование памяти минимально в обоих случаях; возможно 50 или 60 МБ в обоих случаях
- Существует множество сбоев страниц (ref MMF), однако они возникают медленнее, когда подключен отладчик
- Если процесс размещения VS не используется или, по сути, вступает в игру «монитор удаленной отладки», то , что использует приличное количество ЦП и создает большое количество сбоев страниц. Но это не единственный раз, когда возникает проблема
- Разница в производительности видна независимо от того, как работает клиент. Единственная изменяемая переменная - это компонент сервера, запускаемый с помощью «Начать с отладки» и запускаемый из Проводника.
Мои идеи:
- WCF медленный при отладке?
- MemoryMappedFiles замедляется при отладке?
- Использовано 40 потоков - медленно отлаживать? Возможно, мониторы / блокировки уведомляют отладчик? Планирование потоков становится странным / переключение контекста очень редко?
- Космическое фоновое излучение, придающее разум и жестокое чувство юмора ВС
Все кажутся глупо маловероятными.
Итак, мои вопросы:
- Почему это происходит?
- Если № 1 неизвестен, как я могу диагностировать / выяснить?