Служба WCF, размещенная в службе Windows, работает в 10 раз медленнее, чем консольное приложение - PullRequest
10 голосов
/ 08 марта 2011

У меня есть библиотека C #, которая выполняет некоторую обработку файлов.Я создал консольное и настольное приложение, которое использует библиотеку и обрабатывает файл размером 256 МБ примерно за 1 минуту.Затем я создал службу WCF, размещенную в службе Windows, которая использует ту же библиотеку обработки файлов, но обрабатывает тот же файл 256 МБ при вызове с веб-сайта, в 10 раз дольше.Служба Windows работает под учетной записью домена с правами администратора.

Затраты на вызов службы WCF очень высоки, но метод LoadFile занимает намного больше времени.Я пытался увеличить приоритет процесса при запуске через

Process.GetCurrentProcess ().PriorityClass = ProcessPriorityClass.High;

, но безрезультатно.Я запустил этот сервис на 64-битной настольной системе Win7 (6 ГБ), 32-битном сервере 2003 XP (4 ГБ) и 32-битном сервере 2008 R2 (4 ГБ) с похожими результатами.Каждое консольное и настольное приложения обрабатывают файл примерно за 1 минуту в вышеуказанной системе.Процесс, по-видимому, не ограничен в памяти и входит в swapville.

Службы windows каким-то образом ограничены в процессе?Получу ли я лучшие результаты при запуске службы WCF под IIS?

РЕДАКТИРОВАТЬ: Я попытался вызвать каталог библиотеки с веб-сайта, и это тоже в 10 раз дольше, чем консольное или настольное приложение.*

ОБНОВЛЕНИЕ: Оказывается, это был Log4PostSharp.В консольных и настольных приложениях не было никаких следов log4net в файлах конфигурации, хотя на веб-сайте и в службе Windows это было сделано.Был log4net TraceAppender, молча поглощающий драгоценные циклы процессора.

1 Ответ

4 голосов
/ 08 марта 2011

Я не могу понять, почему поведение, которое вы описываете, происходит - оно кажется очень странным.Поскольку вы обрабатываете относительно большой файл в памяти, сборщик мусора может повлиять на него.Вы можете попробовать изменить режим, в котором работает сборщик мусора, чтобы увидеть, имеет ли он какой-либо эффект.

У сборщика мусора есть три режима - рабочая станция, сервер и одновременный.Каждый из них ведет себя по-своему и оптимизирован для различных типов приложений.Режим рабочей станции является режимом по умолчанию и используется всеми процессами, если только он не настроен на использование чего-либо другого.Более подробную информацию о режимах можно найти здесь .

Попробуйте явно настроить сборщик мусора на использование режима сервера (хотя это повлияет только на многопроцессорную машину).Для этого поместите в файл app.config следующее:

<configuration>
    <runtime>
        <gcServer enabled="true" />
    </runtime>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...