Kestrel是aspnetcore中的web服务器之一,其本身有跨平台,轻量级,高性能的特点
在 ryzen 1600 12核cpu 测试环境中,瞬间每秒处理请求数能达到2w5以上,与netty不相上下,相当于同样环境下iis ASP.NET处理能力的3倍左右
为了了解Kestrel为什么如此强劲,我从github上下载了源代码进行分析,地址是:
Kestrel端口监听参数使用的是 EndPoint ,包含了需要监听的IP和端口信息
对于每一个 EndPoint ,使用一个 ITransport 实例进行监听, ITransport 由 ITransportFactory 工厂创建
ITransportFactory 为单实例,默认为 SocketTransportFactory ,该工厂由 UseKestrel 的启动参数设置
Kestrel的有两种TransportFactory的实现
在启动时,首先从 ServiceCollection 中获取到 ITransportFactory ,使用工厂再创建一个 ITransport
SocketTransport 在初始化时创建一个调度器数组 _schedulers = PipeScheduler[]
数组大小为 ioQueueCount , ioQueueCount 从配置中读取,默认数量为cpu线程数,线程数不足16的情况下为16
如果指定了 ioQueueCount 的情况下,并且值为0,将会抛出异常
在 SocketTransport 中调度器使用的是 IOQueue 实现,其具体实现是通过 ThreadPool.QueueU