Allow Nagle’s algorithm to be disabled via IKestrelServerInformation.NoDelay

This commit is contained in:
Stephen Halter 2015-10-19 12:44:21 -07:00
parent c809beec18
commit 8f0d1179ab
10 changed files with 29 additions and 1 deletions

View File

@ -23,6 +23,7 @@ namespace SampleApp
{
var ksi = app.ServerFeatures.Get<IKestrelServerInformation>();
//ksi.ThreadCount = 4;
ksi.NoDelay = true;
loggerFactory.MinimumLevel = LogLevel.Debug;

View File

@ -25,6 +25,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{
var socket = new UvTcpHandle(Log);
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
socket.NoDelay(NoDelay);
socket.Bind(ServerAddress);
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
return socket;
@ -39,6 +40,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{
var acceptSocket = new UvTcpHandle(Log);
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
acceptSocket.NoDelay(NoDelay);
try
{

View File

@ -25,6 +25,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{
var socket = new UvTcpHandle(Log);
socket.Init(Thread.Loop, Thread.QueueCloseHandle);
socket.NoDelay(NoDelay);
socket.Bind(ServerAddress);
socket.Listen(Constants.ListenBacklog, ConnectionCallback, this);
return socket;
@ -39,6 +40,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{
var acceptSocket = new UvTcpHandle(Log);
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
acceptSocket.NoDelay(NoDelay);
try
{

View File

@ -21,6 +21,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
{
var acceptSocket = new UvTcpHandle(Log);
acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle);
acceptSocket.NoDelay(NoDelay);
return acceptSocket;
}
}

View File

@ -9,6 +9,8 @@ namespace Microsoft.AspNet.Server.Kestrel
{
int ThreadCount { get; set; }
bool NoDelay { get; set; }
IConnectionFilter ConnectionFilter { get; set; }
}
}

View File

@ -15,6 +15,8 @@ namespace Microsoft.AspNet.Server.Kestrel
public int ThreadCount { get; set; }
public bool NoDelay { get; set; }
public IConnectionFilter ConnectionFilter { get; set; }
public void Initialize(IConfiguration configuration)

View File

@ -202,6 +202,15 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking
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)]
protected delegate int uv_pipe_init(UvLoopHandle loop, UvPipeHandle handle, int ipc);
protected uv_pipe_init _uv_pipe_init = default(uv_pipe_init);

View File

@ -61,6 +61,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking
_uv.tcp_open(this, hSocket);
}
public void NoDelay(bool enable)
{
_uv.tcp_nodelay(this, enable);
}
/// <summary>
/// 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.

View File

@ -61,7 +61,8 @@ namespace Microsoft.AspNet.Server.Kestrel
AppLifetime = _appLifetime,
Log = new KestrelTrace(_logger),
DateHeaderValueManager = dateHeaderValueManager,
ConnectionFilter = information.ConnectionFilter
ConnectionFilter = information.ConnectionFilter,
NoDelay = information.NoDelay
});
disposables.Push(engine);

View File

@ -22,6 +22,7 @@ namespace Microsoft.AspNet.Server.Kestrel
Log = context.Log;
DateHeaderValueManager = context.DateHeaderValueManager;
ConnectionFilter = context.ConnectionFilter;
NoDelay = context.NoDelay;
}
public IApplicationLifetime AppLifetime { get; set; }
@ -33,5 +34,7 @@ namespace Microsoft.AspNet.Server.Kestrel
public DateHeaderValueManager DateHeaderValueManager { get; set; }
public IConnectionFilter ConnectionFilter { get; set; }
public bool NoDelay { get; set; }
}
}