Add SocketTransportOption to enable/disable WaitForData (#19396)
This commit is contained in:
parent
98ce12714a
commit
cef755fd82
|
|
@ -31,5 +31,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
|
|||
public long? MaxReadBufferSize { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute] set { } }
|
||||
public long? MaxWriteBufferSize { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute] set { } }
|
||||
public bool NoDelay { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute] set { } }
|
||||
public bool WaitForDataBeforeAllocatingBuffer { [System.Runtime.CompilerServices.CompilerGeneratedAttribute] get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute] set { } }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
|
|||
PipeScheduler.ThreadPool,
|
||||
_trace,
|
||||
_options.MaxReadBufferSize,
|
||||
_options.MaxWriteBufferSize);
|
||||
_options.MaxWriteBufferSize,
|
||||
_options.WaitForDataBeforeAllocatingBuffer);
|
||||
|
||||
socketConnection.Start();
|
||||
return socketConnection;
|
||||
|
|
|
|||
|
|
@ -33,13 +33,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
|||
private Task _processingTask;
|
||||
private readonly TaskCompletionSource<object> _waitForConnectionClosedTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||
private bool _connectionClosed;
|
||||
private readonly bool _waitForData;
|
||||
|
||||
internal SocketConnection(Socket socket,
|
||||
MemoryPool<byte> memoryPool,
|
||||
PipeScheduler scheduler,
|
||||
ISocketsTrace trace,
|
||||
long? maxReadBufferSize = null,
|
||||
long? maxWriteBufferSize = null)
|
||||
long? maxWriteBufferSize = null,
|
||||
bool waitForData = true)
|
||||
{
|
||||
Debug.Assert(socket != null);
|
||||
Debug.Assert(memoryPool != null);
|
||||
|
|
@ -48,6 +50,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
|||
_socket = socket;
|
||||
MemoryPool = memoryPool;
|
||||
_trace = trace;
|
||||
_waitForData = waitForData;
|
||||
|
||||
LocalEndPoint = _socket.LocalEndPoint;
|
||||
RemoteEndPoint = _socket.RemoteEndPoint;
|
||||
|
|
@ -186,8 +189,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
|
|||
var input = Input;
|
||||
while (true)
|
||||
{
|
||||
// Wait for data before allocating a buffer.
|
||||
await _receiver.WaitForDataAsync();
|
||||
if (_waitForData)
|
||||
{
|
||||
// Wait for data before allocating a buffer.
|
||||
await _receiver.WaitForDataAsync();
|
||||
}
|
||||
|
||||
// Ensure we have some reasonable amount of buffer space
|
||||
var buffer = input.GetMemory(MinAllocBufferSize);
|
||||
|
|
|
|||
|
|
@ -112,7 +112,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
|
|||
acceptSocket.NoDelay = _options.NoDelay;
|
||||
}
|
||||
|
||||
var connection = new SocketConnection(acceptSocket, _memoryPool, _schedulers[_schedulerIndex], _trace, _options.MaxReadBufferSize, _options.MaxWriteBufferSize);
|
||||
var connection = new SocketConnection(acceptSocket, _memoryPool, _schedulers[_schedulerIndex], _trace,
|
||||
_options.MaxReadBufferSize, _options.MaxWriteBufferSize, _options.WaitForDataBeforeAllocatingBuffer);
|
||||
|
||||
connection.Start();
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets
|
|||
/// </remarks>
|
||||
public int IOQueueCount { get; set; } = Math.Min(Environment.ProcessorCount, 16);
|
||||
|
||||
/// <summary>
|
||||
/// Wait until there is data available to allocate a buffer. Setting this to false can increase throughput at the cost of increased memory usage.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Defaults to true.
|
||||
/// </remarks>
|
||||
public bool WaitForDataBeforeAllocatingBuffer { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Set to false to enable Nagle's algorithm for all connections.
|
||||
/// </summary>
|
||||
|
|
|
|||
Loading…
Reference in New Issue