У нас есть приложение, которое имеет службу WCF (* .svc), работающую на IIS7, и различные клиенты, запрашивающие эту службу. На сервере работает Win 2008 Server. Клиенты работают либо на сервере Windows 2008 Server, либо на Windows 2003. Я получаю следующее исключение, которое, как я видел, фактически может быть связано с большим количеством потенциальных проблем WCF.Подробное исследование исключения таймаута WCF
System.TimeoutException: The request channel timed out while waiting for a reply after 00:00:59.9320000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The HTTP request to 'http://www.domain.com/WebServices/myservice.svc/gzip' has exceeded the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout.
Я увеличил таймаут до 30 минут, и ошибка все еще произошла. Это говорит мне, что что-то еще играет, потому что количество данных никогда не может занять 30 минут для загрузки или загрузки.
Ошибка приходит и уходит. На данный момент это чаще. Кажется, не имеет значения, есть ли у меня 3 клиента одновременно или 100, это все равно происходит время от времени. Большую часть времени нет тайм-аутов, но я все равно получаю несколько часов в час. Ошибка возникает из любого из методов, которые вызывают. Один из этих методов не имеет параметров и возвращает бит данных. Другой принимает множество данных как параметр, но выполняет асинхронно. Ошибки всегда исходят от клиента и никогда не ссылаются на какой-либо код на сервере в трассировке стека. Это всегда заканчивается:
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
На сервере: Я попытался (и в настоящее время) следующие обязательные параметры: Это не похоже
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"
иметь влияние.
Я попытался (и в настоящее время) следующие параметры регулирования:
<serviceThrottling maxConcurrentCalls="1500" maxConcurrentInstances="1500" maxConcurrentSessions="1500"/>
Это, кажется, не имеют влияния.
В настоящее время у меня есть следующие настройки для службы WCF.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
Я побежал с ConcurrencyMode.Multiple
на некоторое время, а ошибка все еще происходит.
Я попытался перезапустить IIS, перезапустив базовый SQL Server, перезапустив машину. Все это, похоже, не влияет.
Я попытался отключить брандмауэр Windows. Кажется, это не влияет.
На клиенте, у меня есть следующие настройки:
maxReceivedMessageSize="2147483647"
<system.net>
<connectionManagement>
<add address="*" maxconnection="16"/>
</connectionManagement>
</system.net>
Мой клиент закрывает его подключения:
var client = new MyClient();
try
{
return client.GetConfigurationOptions();
}
finally
{
client.Close();
}
Я изменил параметры реестра, чтобы позволить более исходящих соединений:
MaxConnectionsPerServer=24, MaxConnectionsPer1_0Server=32.
Я недавно попробовал SvcTraceViewer.exe. Мне удалось получить одно исключение на стороне клиента. Я вижу, что его продолжительность составляет 1 минуту. Посмотрев на трассировку на стороне сервера, я вижу, что сервер не знает об этом исключении. Максимальная продолжительность, которую я вижу, составляет 10 секунд.
Я рассмотрел активные подключения к базе данных, используя exec sp_who
на сервере. У меня только несколько (2-3).Я просмотрел TCP-соединения с одного клиента, используя TCPview. Обычно это около 2-3, и я видел до 5 или 6.
Проще говоря, я в тупике. Я пробовал все, что мог найти, и должен пропустить что-то очень простое, что сможет увидеть эксперт WCF. Я чувствую, что что-то блокирует моих клиентов на низкоуровневом (TCP), прежде чем сервер действительно получит сообщение и/или что-то в очереди сообщений на уровне сервера и никогда не позволяет им обрабатывать.
Если у вас есть счетчики производительности, я должен посмотреть, пожалуйста, дайте мне знать. (пожалуйста, укажите, какие значения являются плохими, поскольку некоторые из этих счетчиков трудно дешифровать). Кроме того, как я могу зарегистрировать размер сообщения WCF? Наконец, есть ли там какие-либо инструменты, которые позволят мне проверить, сколько соединений я могу установить между моим клиентом и сервером (независимо от моего приложения)
Спасибо за ваше время!
Дополнительная информация добавлена 20 июня:
Моя WCF приложение делает что-то подобное следующему.
while (true)
{
Step1GetConfigurationSettingsFromServerViaWCF(); // can change between calls
Step2GetWorkUnitFromServerViaWCF();
DoWorkLocally(); // takes 5-15minutes.
Step3SendBackResultsToServerViaWCF();
}
Использование WireShark, я видел, что, когда происходит ошибка, у меня есть пять TCP повторной передачи с последующим сбросом TCP позже. Я предполагаю, что RST исходит из WCF, убивающего соединение. Сообщение об исключении, которое я получаю, относится к тайм-ауту Step3.
Я обнаружил это, посмотрев на поток tcp «tcp.stream eq 192». Затем я расширил свой фильтр до «tcp.stream eq 192, http и http.request.method eq POST» и увидел 6 POST в течение этого потока. Это показалось странным, поэтому я проверил с другим потоком, таким как tcp.stream eq 100. У меня было три POST, что кажется немного более нормальным, потому что я выполняю три вызова. Тем не менее, я закрываю свое соединение после каждого вызова WCF, поэтому я ожидал бы одного вызова в потоке (но я не знаю много о TCP).
Изучив немного больше, я сбросил нагрузку пакета HTTP на диск, чтобы посмотреть, что эти шесть вызовов где.
1) Step3
2) Step1
3) Step2
4) Step3 - corrupted
5) Step1
6) Step2
Мое предположение заключается в том, что два одновременных клиента используют одно и то же соединение, поэтому я видел дубликаты. Тем не менее, у меня есть еще несколько вопросов, которые я не могу понять:
a) Почему пакет поврежден? Случайная сетевая случайность - может быть? Нагрузка загружается с использованием этого кода: http://msdn.microsoft.com/en-us/library/ms751458.aspx - Может ли код некорректно использовать время от времени при одновременном использовании? Я должен проверить без библиотеки gzip.
b) Почему я должен видеть шаг 1 & шаг 2 работает ПОСЛЕ того, как поврежденная операция была нарушена? Мне кажется, что эти операции не должны были произойти. Возможно, я не смотрю на правильный поток, потому что мое понимание TCP ошибочно. У меня есть другие потоки, которые происходят одновременно. Я должен исследовать другие потоки - быстрый взгляд на потоки 190-194 показывает, что POST Step3 имеет правильные данные полезной нагрузки (не поврежден). Нажав, я снова посмотрю на библиотеку gzip.
Джейсон - вы когда-нибудь решить эту проблему? Была ли настройка DefaultConnectionLimit? – SFun28
@JasonKealey - В отличие от многих других вопросов, вас нельзя обвинять в том, что вы не пытаетесь для себя, прежде чем публиковать вопрос :) Мне нравится, что ваш вопрос настолько детализирован и включает в себя все важные детали. Симптомы, которые вы описываете, очень похожи на мои, поэтому я надеюсь, что решение будет таким же :) :) –