fasthttp性能优化点

本文介绍了Go的fasthttp库在性能优化方面的几个关键点:1. 响应缓冲以减少系统调用;2. 延迟HTTP头解析以提高效率;3. 使用slice代替map存储键值对以节省内存和提升速度;4. 重用requestCtx来减少内存分配;5. 实现DNS缓存以降低解析延迟;6. 应用协程池来优化并发处理。同时,文中还讨论了这些优化策略的优缺点及其适用场景。
摘要由CSDN通过智能技术生成

1.response buffering

这个是优化对于http 1.1 的pipeline,会有多个request和response的请求。如下图

原始go http server的处理伪代码如下

 

 工作模式很简单,这个链接有读事件,就读取请求,然后处理请求,然后响应给客户端,可以看到如果是pipeline方式的话,会多次调用read 和 write系统调用。 

所以fasthttp用了个buffer,缓冲response数据,等到请求数据没了的话,再一起发送给客户端,代码如下

优点:

1.减少了recv系统调用,合并多个小请求通过一个recv系统调用

2.减少了send系统调用,合并多个小响应通过一个send系统调用

这里要简单介绍下bufio的原理:`bufio.Reader`的基本工作原理是使用一块预先分配好的内存作为缓冲区,发生真实IO的时候尽量填充缓冲区,调用者读取数据的时候先从缓冲区中读取,从而减少真实的IO调用次数,以起到优化作用。

即平常的话,我们是发送系统调用,切到内核,读数据,然后再切到内核态,这样一次次切。

而bufio的话,应该是切到内核态一直接受数据,直到buffer满或者遇到了指定截断的字符。(这个地方,可能就需要自己代码里来切割 http 请求了,安装http 协议的一些换行,回车啊来切分)。

缺点:

1.延迟响应,会让客户端感觉慢

2.http 1.1 pipeline支持的server比较少,大部分会禁用,一般难以用到

2.deferring http headers parsing

fasthttp会延迟解析http headers,直到他们被需要。它仅搜索htttp header的末尾标记(\r\n),然后把这个未被解析的头部数据,从输入buffer拷贝到一个byte slice中。这个 byte slice只当第一次需要访问http header的时候会解析成http header。

上面这段代码,没有读取http header,所以http header不会被解析的

 上面的这段代码就会解析http headers

3.slice instead of maps for (key->value) entries

fasthttp使用slice 替代map 存储下面的实体

1.http headers

2.query args 

3.cookies 

这个slice 实现如下

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小卒曹阿瞒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值