You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:14:18