Управление потреблением ресурсов и повышение производительности
В данном разделе описано несколько свойств разных областей архитектуры Windows Communication Foundation (WCF), которые служат для контроля за потреблением ресурсов и влияют на метрики производительности.
Свойства, ограничивающие потребление ресурсов в WCF
Windows Communication Foundation (WCF) накладывает ограничения на некоторые типы процессов либо из соображений безопасности, либо из соображений производительности. Такие ограничения накладываются в двух основных формах: квот и регулировок. Квоты — это пределы, по достижении или превышении которых в какой-либо точке системы немедленно вызывается исключение. Регулировки — это пределы, которые не приводят к немедленному вызову исключения. Вместо этого по достижении предела регулировки обработка продолжается, но уже в рамках пределов, установленных значением регулировки. Во время ограниченной таким образом обработки исключение, в зависимости от приложения, может быть вызвано в другом месте.
Кроме различий между квотами и регулировками, некоторые ограничивающие свойства располагаются на уровне сериализации, некоторые — на транспортном уровне, некоторые — на уровне приложения. Например, чтобы препятствовать атакам типа «отказ в обслуживании» на службу со стороны вредоносных клиентов, приводящим к чрезмерному потреблению памяти, квота System.ServiceModel.Channels.TransportBindingElement.MaxReceivedMessageSize, реализованная всеми поддерживаемыми системой элементами привязки транспорта, по умолчанию имеет значение 65 536. (Обычно, уменьшая это значение, можно увеличить производительность.)
Примером квоты сериализации является свойство System.Runtime.Serialization.DataContractSerializer.MaxItemsInObjectGraph, задающее максимальное число объектов, которые сериализатор сериализует или десериализует за один вызов метода ReadObject. Примером регулировки на уровне приложения является свойство System.ServiceModel.Dispatcher.ServiceThrottle.MaxConcurrentSessions, которое по умолчанию ограничивает до 10 число одновременных подключений каналов сеанса. (В отличие от квот, по достижении значения, заданного регулировкой, приложение продолжает обработку, но не принимает новые каналы сеанса — это означает, что новые клиенты не могут подключиться, пока не прекратится соединение по одному из каналов сеанса.)
Данные элементы управления представляют собой встроенную защиту от некоторых типов атак или улучшают метрики производительности, такие как используемый объем памяти, время запуска и т. п. Однако, в зависимости от приложения, данные элементы управления могут снижать производительность приложения службы или вовсе препятствовать работе приложения. Например, приложение, предназначенное для потокового видео, может легко превысить заданное по умолчанию свойство System.ServiceModel.Channels.TransportBindingElement.MaxReceivedMessageSize. В настоящем разделе приводятся общие сведения о различных средствах, применяемых к приложениям на всех уровнях WCF, описываются разные способы получения более подробной информации о том, замедляет ли параметр работу приложения, и способы устранения ряда проблем. Большинство ограничителей и некоторые квоты доступны на уровне приложения, даже когда базовым свойством является ограничение сериализации или транспорта. Например, можно задать в классе службы свойство System.Runtime.Serialization.DataContractSerializer.MaxItemsInObjectGraph с помощью свойства System.ServiceModel.ServiceBehaviorAttribute.MaxItemsInObjectGraph.
Примечание |
---|
При возникновении какой-либо проблемы сначала нужно прочесть Примеры устранения неполадок WCF и проверить, не описана ли там возникающая проблема (и способ ее решения). |
Свойства, ограничивающие процессы сериализации, перечислены в Вопросы безопасности для данных. Свойства, ограничивающие потребление ресурсов, относящихся к транспорту, перечислены в Квоты транспорта. Свойства, ограничивающие потребление ресурсов на уровне приложения, являются членами класса ServiceThrottle.
Выявление проблем с приложением и производительностью, связанных с параметрами квоты
Значения по умолчанию указанных выше параметров выбраны таким образом, чтобы обеспечить функциональность основного приложения в широком диапазоне типов приложения, обеспечивая при этом основную защиту от общих проблем безопасности. Однако дизайн некоторых приложений может превышать значение одного или нескольких параметров регулировки, хотя в противном случае приложение защищено и будет работать, как было задумано. В таких случаях необходимо определить, какие значения ограничителей и на каком уровне превышены, и принять решение о соответствующих действиях по повышению пропускной способности приложения.
Обычно при написании и отладке приложения свойству System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults программно или с помощью файла конфигурации присваивается значение true. При этом WCF получает инструкцию на возврат содержимого стека исключения службы в клиентское приложение для просмотра. Данная функция позволяет создавать отчеты о большинстве исключений на уровне приложения таким образом, чтобы показать, если проблема заключается в этом, какие параметры квоты могут являться причиной.
Некоторые исключения вызываются во время выполнения за пределами видимости уровня приложения, не возвращаются при помощи такого механизма и не могут быть обработаны пользовательской реализацией System.ServiceModel.Dispatcher.IErrorHandler. В среде разработки, такой как Microsoft Visual Studio, большинство исключений отображается автоматически. Однако некоторые исключения могут иметь маску, наложенную параметрами среды разработки, такую как параметры Just My Code в Visual Studio 2005.
Независимо от возможностей среды разработки, для трассировки и регистрации сообщений с целью отладки всех исключений и настройки производительности собственных приложений можно использовать возможности WCF. Дополнительные сведения см. в разделе Использование трассировки для устранения неполадок приложения.
Проблемы производительности и XmlSerializer
Службы и клиентские приложения, использующие типы данных, сериализуемых при помощи сериализатора XmlSerializer, создают и компилируют код сериализации для этих типов данных во время выполнения, что может привести к снижению производительности при запуске.
Примечание |
---|
Предварительно созданный код сериализации может использоваться только в клиентских приложениях, а не в службах. |
Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) может улучшить производительность при запуске этих приложений путем создания необходимого кода сериализации из компилированных сборок для приложения. Дополнительные сведения см. в разделе Как сократить время запуска клиентских приложений WCF с использованием XmlSerializer.
Проблемы производительности при размещении служб WCF под ASP.NET
Когда служба WCF размещается под IIS и ASP.NET, параметры конфигурации IIS и ASP.NET могут повлиять на пропускную способность и объем занимаемой службой WCF памяти. Дополнительные сведения о производительности ASP.NET см. Повышение производительности ASP.NET. Есть один параметр, использование которого может иметь непредвиденные последствия. Это MinWorkerThreads, который является свойством ProcessModelSection. Если приложение имеет фиксированное или небольшое количество клиентов, изменение параметра MinWorkerThreads на 2 может обеспечить повышение пропускной способности на многопроцессорных компьютерах с близким к 100% использованием ЦП. За такое увеличение производительности приходится платить: оно также влечет за собой повышение использования памяти, что может снизить масштабируемость.
См. также
Основные понятия
Администрирование и диагностика
Большие наборы данных и потоковая передача