У меня есть служба net-tcp WCF, работающая в общедоступном облаке. Проблема в том, что я получаю только около 3 Мбит/с на соединение. Очень далеко от предела как сети, так и сервера. При параллельной загрузке 2-х потоков с одного сервера у меня скорость 6 мбит/сек и так далее.
Можно ли увеличить скорость этих соединений? Меня не слишком волнует использование ресурсов сервера (каждый сервер имеет 90 ГБ ОЗУ) или атаки типа «отказ в обслуживании» (сервер требует аутентификации и имеет очень мало одновременных пользователей).
Сервисный контракт выглядит так:
[ServiceContract( Namespace = "http://mycompany.com", SessionMode = SessionMode.Allowed )]
public interface iStreaming
{
[OperationContract]
Task<Stream> downloadStuff( string a, long b );
}
Конфигурация привязки:
NetTcpBinding ntb = new NetTcpBinding();
ntb.Security = new NetTcpSecurity() { Mode = SecurityMode.None };
ntb.TransferMode = TransferMode.Streamed;
ntb.MaxReceivedMessageSize = 1024 * 1024 * 1024;
ntb.MaxBufferSize = 1024 * 256;
ntb.MaxBufferPoolSize = 1024 * 1024;
ntb.SendTimeout = TimeSpan.FromMinutes( 30 );
Реализация сервера:
[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple )]
class Streaming: iStreaming
{
Task<Stream> iStreaming.downloadStuff( string a, long b )
{
// Send a file from local disk
string sourcePath = makePath( a, b );
return File.OpenRead( sourcePath );
}
}
Клиент вызывает stream.CopyTo() или stream.CopyToAsync() в MemoryStream или в файл на быстром SSD. Сервер работает под управлением Windows Server 2019.
Обновление: измерена пропускная способность с 1–12 подключениями, и вот результат:
Почти линейно. Похоже, что-то в WCF ограничивает скорость для каждого потока. В идеале мне нужна полная скорость для одного соединения, моим конечным пользователям нужен только 1 файл/каждый.