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>(); var ksi = app.ServerFeatures.Get<IKestrelServerInformation>();
//ksi.ThreadCount = 4; //ksi.ThreadCount = 4;
ksi.NoDelay = true;
loggerFactory.MinimumLevel = LogLevel.Debug; loggerFactory.MinimumLevel = LogLevel.Debug;

View File

@ -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
{ {

View File

@ -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
{ {

View File

@ -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;
} }
} }

View File

@ -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; }
} }
} }

View File

@ -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)

View File

@ -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);

View File

@ -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.

View File

@ -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);

View File

@ -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; }
} }
} }