go-fasthttp源码分析
1、架构
listener->server->workerpool
1.1、workerpool中有两种缓存:
a、wp.ready,缓存未退出worker,
b、worker退出后用sync.pool缓存channel
worker就是工作协程,它的存活期由maxIdleWorkerDuration控制,因此每次使用后都用lastUseTime记录。
workerpool每maxIdleWorkerDuration时间会使用“least recently used”策略清理掉空闲时间超过maxIdleWorkerDuration的,因为ready是按使用顺序排的(每次worker执行完workerFunc会append到最后),因此只要找到第一个时间超过maxIdleWorkerDuration的,把它和之前的workerChan都停掉、置nil即可。
问题:为什么有了worker的缓存,还需要缓存channel?
回答:fasthttp号称“Zero memory allocations in hot paths”,channel的make也算是allocation,可能也会耗时吧。
1.2、listener可以是net.Listen生成,也可以是reuseport.Listen生成,对多核机器性能表现更好。
2、解码
把server.ServeConn()作为workerpool的WorkerFunc传给worker
s.serveConn(c)主要就是从pool中取一个ctx,然后用bufio.Reader|bytePool封装conn,然后http request.readLimitBody
通过b, err := r(bufio.Reader).Peek(n)来每次重新header.Parse(b),从请求行开始解析,最终readRawHeaders读到两个\n,再一股脑拷贝到RequestHeader.rawHeaders中。
问题:为什么不用bufio.Reader.ReadBytes([]byte("\r\n\r\n"))直接读到headers结束呢?
回答:Peek是返回bufio.Reader.buffer的slice,没有memory allocation,比ReadBytes性能要好。
问题为什么不直接连续Peek到两个\r\n就结束?
回答:这段代码就是这个思路。
go-fasthttp源码分析的更多相关文章
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...
随机推荐
- Android笔记: 在Eclipse环境下使用Genymotion模拟器
1.为什么用Genymotion? Genymotion使用x86构架的android系统,在PC上跑起来速度快的飞起,部署速度比真机还快,还有谁? 2.下载Genymotion. Genymotio ...
- 震惊!WIN2003存在后门大全,提权成功率高
从某种意义上说,服务器被攻击是不可避免的,甚至被控制也情有可原.但绝对不能容忍的是,服务器被植入后门,攻击者如入无人之境,而管理者去浑然不觉.本文将对当前比较流行的后门技术进行解析,知己知彼方能杜绝 ...
- python自学1——代码优化1
优化了上次的代码,请求方式可接收get和post两种,代码中对两种方式做了判断. 测试结果中提取了测试用例的名称.请求返回的状态.请求的时间. #coding:utf-8 import xlrd im ...
- Gitlab-CI持续集成之Runner配置和CI脚本
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...
- 正则表达式过滤HTML、JS、CSS
功能用途 主要是用来提取html页面内容时使用. 示例代码 using System; using System.Collections.Generic; using System.Linq; usi ...
- 如何编写更好的SQL查询:终极指南-第三部分
本次我们学习<如何编写更好的SQL查询>系列的最后一篇文章. 时间复杂度和大O符号 通过前两篇文章,我们已经对查询计划有了一定了解.接下来,我们还可以借助计算复杂度理论,来进一步深入地挖掘 ...
- JavaScript学习日志(六):事件
这篇随笔,深恶痛绝,敲到快结束的时候,凌晨00:19,突然闪退,也不知道是Mac的原因还是chrome的原因,重新打开的时候,以为自动保存有效果,心想没关系,结果他么的只保存了四分之一,WTF?!!! ...
- C# XmlDocument操作XML
XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Lang ...
- [转载]在instagram上面如何利用电脑来上传图片
原文地址:在instagram上面如何利用电脑来上传图片作者:小北的梦呓 我们都知道instagram是一个手机版的app,instagram官方不支持通过电脑来上传图片,而利用手机又很麻烦,那么如果 ...
- MPLS VPN随堂笔记3
跨域 ASBR之间运行MPBGP 1.配置AS内部IGP保证环回口互相可达,同时建立LDP邻居 (优先启用 mpls label rang 16 100)方便查看实验现象 2.配置PE1-PE2 PE ...