Управление потреблением ресурсов и повышение производительности

В этом разделе описываются различные свойства в различных областях архитектуры Windows Communication Foundation (WCF), которые работают для управления потреблением ресурсов и влияют на метрики производительности.

Свойства, ограничивающие потребление ресурсов в WCF

Windows Communication Foundation (WCF) применяет ограничения для определенных типов процессов в целях безопасности или производительности. Такие ограничения накладываются в двух основных формах: квот и регулировок. Квоты — это ограничения, которые при достижении или превышении запускают немедленное исключение в какой-то момент в системе. Регулирование — это ограничения, которые не сразу вызывают исключение. Вместо этого по достижении предела регулировки обработка продолжается, но уже в рамках пределов, установленных значением регулировки. Во время ограниченной таким образом обработки исключение, в зависимости от приложения, может быть вызвано в другом месте.

Кроме различий между квотами и регулировками, некоторые ограничивающие свойства располагаются на уровне сериализации, некоторые - на транспортном уровне, некоторые - на уровне приложения. Например, чтобы препятствовать атакам типа «отказ в обслуживании» на службу со стороны вредоносных клиентов, приводящим к чрезмерному потреблению памяти, квота TransportBindingElement.MaxReceivedMessageSize, реализованная всеми поддерживаемыми системой элементами привязки транспорта, по умолчанию имеет значение 65 536. (Обычно, уменьшая это значение, можно увеличить производительность.)

Примером квоты сериализации является свойство DataContractSerializer.MaxItemsInObjectGraph, задающее максимальное число объектов, которые сериализатор сериализует или десериализует за один вызов метода ReadObject. Примером регулировки на уровне приложения является свойство ServiceThrottle.MaxConcurrentSessions, которое по умолчанию ограничивает до 10 число одновременных подключений каналов сеанса. (В отличие от квот, по достижении значения, заданного регулировкой, приложение продолжает обработку, но не принимает новые каналы сеанса - это означает, что новые клиенты не могут подключиться, пока не прекратится соединение по одному из каналов сеанса.)

Данные элементы управления представляют собой встроенное устранение рисков от некоторых типов атак или улучшают метрики производительности, такие как используемый объем памяти, время запуска и т. п. Однако, в зависимости от приложения, данные элементы управления могут снижать производительность приложения службы или вовсе препятствовать работе приложения. Например, приложение, предназначенное для потокового видео, может легко превысить заданное по умолчанию свойство TransportBindingElement.MaxReceivedMessageSize. В этом разделе представлен обзор различных элементов управления, применяемых к приложениям на всех уровнях WCF, описаны различные способы получения дополнительных сведений о том, препятствует ли параметр приложению, и описывает способы устранения различных проблем. Большинство ограничителей и некоторые квоты доступны на уровне приложения, даже когда базовым свойством является ограничение сериализации или транспорта. Например, можно задать в классе службы свойство DataContractSerializer.MaxItemsInObjectGraph с помощью свойства ServiceBehaviorAttribute.MaxItemsInObjectGraph.

Примечание.

Если у вас есть определенная проблема, сначала ознакомьтесь с кратким руководством по устранению неполадок WCF, чтобы узнать, указана ли проблема (и решение).

Свойства, ограничивающие процессы сериализации, перечислены в разделе "Вопросы безопасности для данных". Свойства, ограничивающие потребление ресурсов, связанных с транспортом, перечислены в квотах транспорта. Свойства, ограничивающие потребление ресурсов на уровне приложения, являются членами класса ServiceThrottle.

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

Обычно при написании и отладке приложения свойству ServiceDebugBehavior.IncludeExceptionDetailInFaults программно или с помощью файла конфигурации присваивается значение true. Это указывает WCF возвращать трассировки стека исключений службы клиентскому приложению для просмотра. Данная функция позволяет создавать отчеты о большинстве исключений на уровне приложения таким образом, чтобы показать, если проблема заключается в этом, какие параметры квоты могут являться причиной.

Некоторые исключения вызываются во время выполнения за пределами видимости уровня приложения, не возвращаются при помощи такого механизма и не могут быть обработаны пользовательской реализацией System.ServiceModel.Dispatcher.IErrorHandler. В среде разработки, такой как Microsoft Visual Studio, большинство исключений отображается автоматически. Однако некоторые исключения можно маскировать с помощью параметров среды разработки, таких как Just My Code Visual Studio.

Независимо от возможностей среды разработки можно использовать возможности трассировки WCF и ведения журнала сообщений для отладки всех исключений и настройки производительности приложений. Дополнительные сведения см. в разделе "Использование трассировки для устранения неполадок с приложением".

Проблемы производительности и XmlSerializer

Службы и клиентские приложения, использующие типы данных, сериализуемых при помощи сериализатора XmlSerializer, создают и компилируют код сериализации для этих типов данных во время выполнения, что может привести к снижению производительности при запуске.

Примечание.

Предварительно созданный код сериализации может использоваться только в клиентских приложениях, а не в службах.

Средство служебной программы метаданных ServiceModel (Svcutil.exe) может повысить производительность запуска для этих приложений, создав необходимый код сериализации из скомпилированных сборок для приложения. Дополнительные сведения см. в разделе "Практическое руководство. Улучшение времени запуска клиентских приложений WCF с помощью xmlSerializer".

Проблемы производительности при размещении служб WCF под ASP.NET

Когда служба WCF размещается под IIS и ASP.NET, параметры конфигурации IIS и ASP.NET могут повлиять на пропускную способность и объем занимаемой службой WCF памяти. Дополнительные сведения о производительности ASP.NET см. в статье "Улучшение ASP.NET производительности". Есть один параметр, использование которого может иметь непредвиденные последствия. Это MinWorkerThreads, который является свойством ProcessModelSection. Если приложение имеет фиксированное или небольшое количество клиентов, изменение параметра MinWorkerThreads на 2 может обеспечить повышение пропускной способности на многопроцессорных компьютерах с близким к 100% использованием ЦП. За такое увеличение производительности приходится платить: оно также влечет за собой повышение использования памяти, что может снизить масштабируемость.

См. также