netcore高性能Web服务器Kestrel分析
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的实现
在启动时,首先从 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分析的更多相关文章
- nginx高性能WEB服务器系列之八--nginx日志分析与切割
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- 再谈高性能Web服务器,MemoryPool的作用
在以往使用c#实现scoket服务器中,通常遇到一个问题就是内存占用高,GC次数频繁,导致处理能力直线下降 其主要原因是在处理socket请求时,大量的申请,复制内存,为了解决这个问题,NET Cor ...
- nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- nginx高性能WEB服务器系列之七--nginx反向代理
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- nginx高性能WEB服务器系列之六--nginx负载均衡配置+健康检查
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- nginx高性能WEB服务器系列之五--实战项目线上nginx多站点配置
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- nginx高性能WEB服务器系列之四配置文件详解
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- nginx高性能WEB服务器系列之三版本升级
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- nginx高性能WEB服务器系列之二命令管理
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
随机推荐
- rm与管道使用
一 问题初始:用通常意义的管道使用这样可以:(1)ls -l | sed -n '/~$/p' 我用显示出系统自己建立的备份文件这时,我想删除这些文件,我仍然使用了管道,并执行了以下命令(2)ls - ...
- JAVA技术路线2
https://www.zhihu.com/question/56110328 1.JavaSE学习视频 http://pan.baidu.com/s/1bp3g6rd2.javaweb的学习视频 h ...
- DOS的几个常用命令
1.rem:注释 DOS中的注释,其后面的内容会被自动忽略.双冒号(::)也有相同的效果 相当于R语言和Python中的# 2.set:设置变量 set var = 1 将1赋值给变量var 打印出来 ...
- 学以致用七---Centos7.2+python3.6.2+django2.1.1 --搭建一个网站(补充)
补充:上一节出现的报错提示 可在settings.py 里,改成 ‘*’ ,这样所有的主机都可以访问了. 打开网页 注意红色框出来的 hello 是和 urls.py里的hello对应 urls.p ...
- Ubuntu 默认启动到命令行 12.04
源文链接:http://my.oschina.net/jackguo/blog/85706 代码: sudo gedit /etc/default/grub 引用: GRUB_CMDLINE_LINU ...
- 基于S2AFCM的子主题划分
http://sztsg.czlib.net:8088/interlibSSO/goto/2/=jmr9bmjh9mds/KXReader/Detail?dbcode=CJFD&filenam ...
- python基于pillow库的简单图像处理
from PIL import Image from PIL import ImageFilter from PIL import ImageEnhance import matplotlib.pyp ...
- 20145232 韩文浩 《Java程序设计》第3周学习总结
教材学习内容总结 在第三章中,知道了Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.在这一周主要学习了类类型. 对象(Object):存在的具体实体,具有明确的状态和行为 类( ...
- Java理论学时第六节。课后作业。
package Fuction; class Grandparent { public Grandparent() { System.out.println("GrandParent Cre ...
- XML与DTD
什么是XML XML个称为Extensible Markup Language,意思是可扩展的标记语言. 应用常见 配置文件 <?xml version="1.0" enco ...