Kestrel是aspnetcore中的web服务器之一,其本身有跨平台,轻量级,高性能的特点

在 ryzen 1600 12核cpu 测试环境中,瞬间每秒处理请求数能达到2w5以上,与netty不相上下,相当于同样环境下iis ASP.NET处理能力的3倍左右

为了了解Kestrel为什么如此强劲,我从github上下载了源代码进行分析,地址是:

https://github.com/aspnet/KestrelHttpServer

Kestrel端口监听参数使用的是 EndPoint ,包含了需要监听的IP和端口信息

对于每一个 EndPoint ,使用一个 ITransport 实例进行监听, ITransport 由 ITransportFactory 工厂创建

ITransportFactory  为单实例,默认为  SocketTransportFactory ,该工厂由  UseKestrel 的启动参数设置

Kestrel的有两种TransportFactory的实现

Kestrel.Transport.Libuv

Kestrel.Transport.Sockets

在启动时,首先从 ServiceCollection 中获取到 ITransportFactory  ,使用工厂再创建一个 ITransport

SocketTransport 在初始化时创建一个调度器数组  _schedulers = PipeScheduler[]

数组大小为 ioQueueCount , ioQueueCount 从配置中读取,默认数量为cpu线程数,线程数不足16的情况下为16

如果指定了 ioQueueCount 的情况下,并且值为0,将会抛出异常

在 SocketTransport 中调度器使用的是 IOQueue 实现,其具体实现是通过  ThreadPool.QueueUserWorkItem  往线程池中工作队列添加工作任务

SocketTransport 启动后,将会运行一个循环任务,每次循环会循环所有调度器,通过 awit AcceptAsync 获取请求信息,然后交给调度器执行连接

对于Socket数据处理部分,使用的是异步Socket,Scoket不同平台的实现是不一样的

在Windows下,Scoket是对windows socket2的简单封装,windows socket2是一套支持阻塞/无阻塞的win32api

对于linux下的实现,我目前还在研究中,对其理解还不够深入

一般情况下,调度器的数量对Kestrel的处理能力影响不是很大,Kestrel对于请求的处理,都是通过往线程池添加工作任务来完成,其处理速度由线程池中的线程数量决定

总的来说,Kestrel是对异步Socket的简单封装,并利用线程池,内存池,实现了Actor模型,所有的请求都是无阻塞处理的,所以在处理能力上提升很大

当然,aspnetcore中间件管道模式也是其性能好的原因之一

netcore高性能Web服务器Kestrel分析的更多相关文章

  1. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  2. 再谈高性能Web服务器,MemoryPool的作用

    在以往使用c#实现scoket服务器中,通常遇到一个问题就是内存占用高,GC次数频繁,导致处理能力直线下降 其主要原因是在处理socket请求时,大量的申请,复制内存,为了解决这个问题,NET Cor ...

  3. nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  4. nginx高性能WEB服务器系列之七--nginx反向代理

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  5. nginx高性能WEB服务器系列之六--nginx负载均衡配置+健康检查

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  6. nginx高性能WEB服务器系列之五--实战项目线上nginx多站点配置

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  7. nginx高性能WEB服务器系列之四配置文件详解

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  8. nginx高性能WEB服务器系列之三版本升级

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  9. nginx高性能WEB服务器系列之二命令管理

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

随机推荐

  1. 关于对话框不能响应OnKeyDown和OnChar函数的一些说明

    (1)现象  在MFC的对话框中,映射了WM_CHAR和WM_KEYDOWN消息响应函数后,还是不能响应OnKeyDown和OnChar. (2)原因  因为MFC在进行设计的时候,这两个消息被对话框 ...

  2. linux上搭建solr(用tomcat部署)

    环境centos7 及最新版本solr7 1.先在/usr/local下mkdir solr 2.在里面新建一个tomcat目录 3.拷贝已经解压的tomat到/usr/local/solr/tomc ...

  3. VHDL基础2

    Signals & Variables VHDL 提供了 signal 和 variable 两种对象来处理非静态数据:提供了 constant 和 generic 来处理静态数据. cons ...

  4. (转)手把手图文教你eclipse下如何配置tomcat

    转自:http://jingyan.baidu.com/article/ca2d939dd90183eb6d31ce79.html 很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置to ...

  5. (转第二方案)在 ASP.NET 環境下使用 Memcached 快速上手指南

    转自:http://blog.miniasp.com/post/2010/01/27/Memcached-for-ASPNET-Quick-Start-Guide.aspx 之前一直想研究 Memca ...

  6. 引用数据类型(Scanner类、Random类)

    Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固 ...

  7. noip第22课作业

    1.   数字分解 [问题描述] 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,当n等于5时有6种拆分方法: 5=1+1+1+1+1 5=1+1+1+2 5=1+1+3 5=1+2+ ...

  8. Codeforces791A Bear and Big Brother

    A. Bear and Big Brother time limit per test 1 second memory limit per test 256 megabytes input stand ...

  9. PAT甲级 1126. Eulerian Path (25)

    1126. Eulerian Path (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue In grap ...

  10. hdu2504

    代码一: //这个没有过 #include<stdio.h> //typedef long long ll; int main() { int T; scanf("%d" ...