.NET Core 2.x中如何配置Kestrel并发数突破256限制?
解决.NET Core 2.x WebSocket连接数限制到256的问题
这个问题我之前帮不少开发者排查过,256这个上限其实和.NET Core 2.x里的线程池默认配置、Kestrel的升级连接限制直接相关,咱们一步步来调整:
1. 调整Kestrel的升级连接并发数限制
WebSocket连接是通过HTTP协议升级而来的,Kestrel在.NET Core 2.x里默认对**升级后的连接(包括WebSocket)**有并发数限制,你需要明确放开这个限制:
方法一:通过appsettings.json配置
在appsettings.json中添加Kestrel的专属配置:
{ "Kestrel": { "Limits": { "MaxConcurrentUpgradedConnections": 1000 // 直接设置你需要的目标连接数,比如1000 } } }
方法二:通过Program.cs代码配置
如果习惯在代码里硬编码配置,可在构建WebHost时直接设置:
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { options.Limits.MaxConcurrentUpgradedConnections = 1000; }) .UseStartup<Startup>() .Build();
2. 调整.NET线程池的最小线程数
.NET Core的线程池默认最小工作线程和IO线程数会和CPU核心数绑定,当并发连接数快速增长时,线程池扩容需要等待,会导致新的WebSocket连接无法及时被处理。你可以在应用启动时手动调整这个数值:
在Startup.cs的Configure方法开头添加:
// 根据服务器硬件配置调整数值,比如设置为2000,避免盲目过大造成资源浪费 ThreadPool.SetMinThreads(2000, 2000);
3. 检查操作系统的TCP连接限制
如果上面的配置调整后仍有问题,需要排查服务器操作系统的底层限制:
- Windows:用
netsh int ipv4 show dynamicport tcp查看动态端口范围,同时调整MaxUserPort和TcpTimedWaitDelay参数优化连接复用; - Linux:修改
/proc/sys/net/core/somaxconn(建议从默认128调整到1024以上),开启net.ipv4.tcp_tw_reuse等参数提升TCP连接效率。
4. 确保WebSocket处理逻辑无阻塞
如果你的WebSocket处理代码里有同步阻塞操作(比如长时间IO、CPU密集型任务),会占用线程池线程,导致无法处理新连接。务必用异步方法(async/await)处理收发逻辑:
public async Task HandleWebSocketAsync(HttpContext context) { var webSocket = await context.WebSockets.AcceptWebSocketAsync(); var buffer = new byte[1024 * 4]; WebSocketReceiveResult result; try { do { result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); // 异步处理数据,避免同步阻塞 await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } while (!result.CloseStatus.HasValue); await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); } catch (Exception ex) { // 异常处理逻辑 } }
内容的提问来源于stack exchange,提问作者Lnn
相关产品推荐
相关产品推荐

