Я работаю над службой WCF, размещенной в службе Windows, используя nettcpbinding.
когда я попытался выполнить нагрузочный тест для службы, я создал простой клиент, который вызывает службу около 1000 вызовов в секунду, возврат из службы сначала занимает от 2 до 8 секунд, а после того, как простой клиент работает примерно полчаса, время возврата результата увеличилось, и некоторые клиенты выдают некоторые исключения тайм-аута для времени отправки, которое было настроено на 2 минуты.
я пересмотрел конфигурацию троллинга службы и вот так
это шаги, которые я пытался выполнить:
изменена конфигурация регулирования службы
<serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentInstances="2147483647" maxConcurrentSessions="2147483647"/>
- работал на машине с Windows 7, поэтому я перешел на сервер 2008, но результат тот же.
обновить конфигурацию привязки tcp следующим образом: NetTcpBinding baseBinding = new NetTcpBinding(SecurityMode.None, true); baseBinding.MaxBufferSize = int.MaxValue;
baseBinding.MaxConnections = int.MaxValue; baseBinding.ListenBacklog = int.MaxValue; baseBinding.MaxBufferPoolSize = long.MaxValue; baseBinding.TransferMode = TransferMode.Buffered; baseBinding.MaxReceivedMessageSize = int.MaxValue; baseBinding.PortSharingEnabled = true; baseBinding.ReaderQuotas.MaxDepth = int.MaxValue; baseBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue; baseBinding.ReaderQuotas.MaxArrayLength = int.MaxValue; baseBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue; baseBinding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue; baseBinding.ReliableSession.Enabled = true; baseBinding.ReliableSession.Ordered = true; baseBinding.ReliableSession.InactivityTimeout = new TimeSpan(23, 23, 59, 59); BindingElementCollection elements = baseBinding.CreateBindingElements(); ReliableSessionBindingElement reliableSessionElement = elements.Find<ReliableSessionBindingElement>(); if (reliableSessionElement != null) { reliableSessionElement.MaxPendingChannels = 128; TcpTransportBindingElement transport = elements.Find<TcpTransportBindingElement>(); transport.ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint = 1000; CustomBinding newBinding = new CustomBinding(elements); newBinding.CloseTimeout = new TimeSpan(0,20,9); newBinding.OpenTimeout = new TimeSpan(0,25,0); newBinding.ReceiveTimeout = new TimeSpan(23,23,59,59); newBinding.SendTimeout = new TimeSpan(0,20,0); newBinding.Name = "netTcpServiceBinding"; return newBinding; } else { throw new Exception("the base binding does not " + "have ReliableSessionBindingElement"); }
изменил функцию моих служб, чтобы использовать асинхронность и ждать
public async Task<ReturnObj> Connect(ClientInfo clientInfo) { var task = Task.Factory.StartNew(() => { // do the needed work // insert into database // query some table to return information to client }); var res = await task; return res; }
и обновил клиент для использования асинхронного режима и ожидания в вызове службы.
- применил решение Worker thread, предложенное по этой ссылке https://support.microsoft.com/en-us/kb/2538826 хотя я использую .net 4.5.1 и установил для MinThreads значение 1000 worker и 1000 IOCP
после всего этого служба начинает обрабатывать больше запросов, но задержка все еще существует, и простому клиенту требуется около 4 часов, чтобы дать тайм-аут
Странно, что я обнаружил, что служба обрабатывает от 8 до 16 вызовов в течение 100 мс, что касается количества потоков, которые в настоящее время находятся в службе.
я нашел много статей, в которых говорится о конфигурации, которую необходимо поместить в machine.config и Aspnet.config, я думаю, что это не связано с моим случаем, поскольку я использую nettcp для службы Windows, а не для IIS, но я реализовал эти изменения и нашел никаких изменений в результатах.
может ли кто-нибудь указать мне, что мне не хватает, или я хочу от службы чего-то, что она не может поддерживать?