fasthttp 高性能原理

fasthttp 高性能原理

fasthttp 性能可以达到net/http 的十倍,fasthttp 作者在已经有了net/http的情况下重头开发fasthttp的原因是因为net/http 的api限制了许多优化机会,fasthttp性能如此高的原因最关键的两个字就是“复用”,能够复用的对象绝不重新开辟分配内存,这减少了大量的内存分配,也减轻了GC压力,尤其是QPS上去后会更加的明显,本篇文章先从宏观角度来了解下fasthttp 如此高性能的原理,我相信读者有了宏观上的了解之后在去读fasthttp相关的源码会更加容易理解。

goroutine 的复用

fasthttp 自己实现了goroutine pool ,在收到连接后会去goroutine pool 里尝试获取空闲的goroutine 来处理这个连接,在连接完毕后会将goroutine 返还至goroutine pool 。而net/http 的实现是简单粗暴的一个连接一个goroutine ,这样的模式我们之前在讲gnet 的时候提到过,绝大多数情况下没有问题,但一旦面临海量连接会导致内存占用高、调度的延时等问题,而且理论上连接数越多这种情况会越明显。fasthttp gourtine 复用的这部分源代码也是下一节的重点分析对象,会带大家从源码来分析fasthttp 是如何复用goroutine 的。

内存变量复用

fasthttp 内部用了大量的sync.Pool,为多次使用的变量节省了大量的内存申请和拷贝开销。在整个框架的实现中,以下几个最常用的对象都用了对象池来实现一个复用的效果(这次请求用完之后归还对象池,下一个请求来了直接用):

  • context Pool ,用来复用requestCtx,requestCtxfasthttp 里面最常用的数据结构,是整个请求的上下文。
  • reader buffer pool ,读取HTTP请求连接,储存用户请求数据。
  • writer buffer pool ,响应用户请求,储存请求响应数据。
  • BytesBuffer pool,把[]byte池化处理

除此fasthttp 为了更好的内存复用还做了一些优化,比如在需要kv 数据类型的地方,用slice 来代替map ,可能有些同学会感到很疑惑,slice 的查找效率是O(n), 而map 的查找效率是O(1),这不是反向优化吗。实际上不是这样的,fasthttp 作者就为什么使用slice 来代替map 给出了以下几点理由:

  • 通常 headersquery 参数或 cookies 的数量很少。因此,可理解为对查询效率影响甚微,毕竟 hash map 计算也要耗时的,还要解决 "碰撞" 问题
  • 在这个场景下,相比于mapslices 提供了更好的性能。(slice 内存利用率更高,map key value内存分布不连续)
  • slic能保存加入的每一项的顺序,而 无法保证。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

go高薪必备:面试框架17讲 文章被收录于专栏

<p> <span style="font-size:14px;">本专刊是Go开源项目源码分析专栏,共 17 篇文章,挑选了Go 开源界知名的 4 个开源项目gnet(高效的网络库)、gin(知名的Go微型web框架)、fasthttp(高性能web框架)、nsq(Go消息队列)来对它们进行源码分析,分析它们的设计思想和代码实现。每个项目的讲解都是由浅入深,由设计思想的剖析到源码实现的分析,更易于读者理解。</span> </p> <p> <br /> </p> <h2> <b><span style="font-size:16px;line-height:1;">购买须知:</span></b> </h2> <span style="font-size:14px;">订阅成功后,用户即可通过牛客网 PC 端、App 端享有永久阅读的权限;</span><br /> <span style="font-size:14px;">牛客专刊为虚拟内容服务,订阅成功后概不退款;</span><br /> <span style="font-size:14px;line-height:1;">在专刊阅</span><span style="font-size:14px;line-height:1;">读过程中,如有任何问题,可在文章评论区底部留言,或添加牛客导师,加入读者交流群;</span><br /> <span style="font-size:14px;">想成为牛客作者,请邮件联系yinxiaoxiao@nowcoder.com,邮件主题【牛客作者+写作方向】,并附上个人简历一份及近期作品一份;</span><br /> <p> <span style="font-size:14px;">牛客专刊版权归本平台所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布 / 发表,违者将依法追究责任</span><span style="font-size:14px;">。</span> </p> <p> <br /> </p>

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务