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