Allow Nagle’s algorithm to be disabled via IKestrelServerInformation.NoDelay
This commit is contained in:
parent
c809beec18
commit
8f0d1179ab
|
|
@ -23,6 +23,7 @@ namespace SampleApp
|
||||||
{
|
{
|
||||||
var ksi = app.ServerFeatures.Get<IKestrelServerInformation>();
|
var ksi = app.ServerFeatures.Get<IKestrelServerInformation>();
|
||||||
//ksi.ThreadCount = 4;
|
//ksi.ThreadCount = 4;
|
||||||
|
ksi.NoDelay = true;
|
||||||
|
|
||||||
loggerFactory.MinimumLevel = LogLevel.Debug;
|
loggerFactory.MinimumLevel = LogLevel.Debug;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var socket = new UvTcpHandle(Log);
|
var socket = new UvTcpHandle(Log);
|
||||||
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
|
socket.NoDelay(NoDelay);
|
||||||
socket.Bind(ServerAddress);
|
socket.Bind(ServerAddress);
|
||||||
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
||||||
return socket;
|
return socket;
|
||||||
|
|
@ -39,6 +40,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var acceptSocket = new UvTcpHandle(Log);
|
var acceptSocket = new UvTcpHandle(Log);
|
||||||
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
|
acceptSocket.NoDelay(NoDelay);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var socket = new UvTcpHandle(Log);
|
var socket = new UvTcpHandle(Log);
|
||||||
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
|
socket.NoDelay(NoDelay);
|
||||||
socket.Bind(ServerAddress);
|
socket.Bind(ServerAddress);
|
||||||
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
|
||||||
return socket;
|
return socket;
|
||||||
|
|
@ -39,6 +40,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var acceptSocket = new UvTcpHandle(Log);
|
var acceptSocket = new UvTcpHandle(Log);
|
||||||
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
|
acceptSocket.NoDelay(NoDelay);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
var acceptSocket = new UvTcpHandle(Log);
|
var acceptSocket = new UvTcpHandle(Log);
|
||||||
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
|
||||||
|
acceptSocket.NoDelay(NoDelay);
|
||||||
return acceptSocket;
|
return acceptSocket;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ namespace Microsoft.AspNet.Server.Kestrel
|
||||||
{
|
{
|
||||||
int ThreadCount { get; set; }
|
int ThreadCount { get; set; }
|
||||||
|
|
||||||
|
bool NoDelay { get; set; }
|
||||||
|
|
||||||
IConnectionFilter ConnectionFilter { get; set; }
|
IConnectionFilter ConnectionFilter { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ namespace Microsoft.AspNet.Server.Kestrel
|
||||||
|
|
||||||
public int ThreadCount { get; set; }
|
public int ThreadCount { get; set; }
|
||||||
|
|
||||||
|
public bool NoDelay { get; set; }
|
||||||
|
|
||||||
public IConnectionFilter ConnectionFilter { get; set; }
|
public IConnectionFilter ConnectionFilter { get; set; }
|
||||||
|
|
||||||
public void Initialize(IConfiguration configuration)
|
public void Initialize(IConfiguration configuration)
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,15 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking
|
||||||
Check(_uv_tcp_open(handle, hSocket));
|
Check(_uv_tcp_open(handle, hSocket));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
protected delegate int uv_tcp_nodelay(UvTcpHandle handle, int enable);
|
||||||
|
protected uv_tcp_nodelay _uv_tcp_nodelay = default(uv_tcp_nodelay);
|
||||||
|
public void tcp_nodelay(UvTcpHandle handle, bool enable)
|
||||||
|
{
|
||||||
|
handle.Validate();
|
||||||
|
Check(_uv_tcp_nodelay(handle, enable ? 1 : 0));
|
||||||
|
}
|
||||||
|
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
protected delegate int uv_pipe_init(UvLoopHandle loop, UvPipeHandle handle, int ipc);
|
protected delegate int uv_pipe_init(UvLoopHandle loop, UvPipeHandle handle, int ipc);
|
||||||
protected uv_pipe_init _uv_pipe_init = default(uv_pipe_init);
|
protected uv_pipe_init _uv_pipe_init = default(uv_pipe_init);
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking
|
||||||
_uv.tcp_open(this, hSocket);
|
_uv.tcp_open(this, hSocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void NoDelay(bool enable)
|
||||||
|
{
|
||||||
|
_uv.tcp_nodelay(this, enable);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns an <see cref="IPEndPoint"/> for the given host an port.
|
/// Returns an <see cref="IPEndPoint"/> for the given host an port.
|
||||||
/// If the host parameter isn't "localhost" or an IP address, use IPAddress.Any.
|
/// If the host parameter isn't "localhost" or an IP address, use IPAddress.Any.
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,8 @@ namespace Microsoft.AspNet.Server.Kestrel
|
||||||
AppLifetime = _appLifetime,
|
AppLifetime = _appLifetime,
|
||||||
Log = new KestrelTrace(_logger),
|
Log = new KestrelTrace(_logger),
|
||||||
DateHeaderValueManager = dateHeaderValueManager,
|
DateHeaderValueManager = dateHeaderValueManager,
|
||||||
ConnectionFilter = information.ConnectionFilter
|
ConnectionFilter = information.ConnectionFilter,
|
||||||
|
NoDelay = information.NoDelay
|
||||||
});
|
});
|
||||||
|
|
||||||
disposables.Push(engine);
|
disposables.Push(engine);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ namespace Microsoft.AspNet.Server.Kestrel
|
||||||
Log = context.Log;
|
Log = context.Log;
|
||||||
DateHeaderValueManager = context.DateHeaderValueManager;
|
DateHeaderValueManager = context.DateHeaderValueManager;
|
||||||
ConnectionFilter = context.ConnectionFilter;
|
ConnectionFilter = context.ConnectionFilter;
|
||||||
|
NoDelay = context.NoDelay;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IApplicationLifetime AppLifetime { get; set; }
|
public IApplicationLifetime AppLifetime { get; set; }
|
||||||
|
|
@ -33,5 +34,7 @@ namespace Microsoft.AspNet.Server.Kestrel
|
||||||
public DateHeaderValueManager DateHeaderValueManager { get; set; }
|
public DateHeaderValueManager DateHeaderValueManager { get; set; }
|
||||||
|
|
||||||
public IConnectionFilter ConnectionFilter { get; set; }
|
public IConnectionFilter ConnectionFilter { get; set; }
|
||||||
|
|
||||||
|
public bool NoDelay { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue