一、性能修炼之道
1、 针对网络库的优化
Go net “BIO”
存下全部header,减少系统调用次数,能够复用内存,能够多次读;
Go net with bufio 绑定一块缓冲区
Netpoll 存下全部 header ,拷贝出完整的body
Netpoll with nocopy peek 分配足够大的buffer ,限制最大的buffer size
不同网络库的优势:go net 流式友好;小包性能高 netpoll:中大包性能高;时延低
2、 针对协议的优化
Headers解析:找到header line 边界:\r\n
先找到一个\n再看它前面是不是\r
更快的方法:SIMD一种汇编流技术,可以将多个一起
针对协议相关的headers快速解析:1、通过header key 首字母快速筛除掉完全不可能的key
3、 解析对应的value到独立字段
4、 3、使用byte slice管理对应header存储,方便复用
5、 请求体中同样处理的key:
取:核心字段快速解析;使用byte slice存储;额外存储到成员变量中
舍:普通header性能较低;没有map结构
Header key 规范化:aaa_bbb ->Aaa_Bbb
取·:超高的转换效率;比net.http提高四十倍 舍:额外的内存开销;变更困难
热点资源池化:request-reqeust response data (request context)->response
与请求一一对应,贯穿一个请求始终
取:减少内存分配;提高内存复用;降低了GC压力;性能提升
舍:额外的reset逻辑;请求内有效;问题定位难度增加
小结:针对网络库的优化:buffer设计
针对协议的优化:header解析、热点资源池化
二、企业实践
追求性能:从性能的角度考虑风险等等
追求易用、减少误用:
打通内部生态:减小开销、易于用户上手;为追求性能优化影响功能
文档建设、用户群建设:帮助用户解决部分问题,提高双方工作效率
内部http框架:hertz
总结:http协议的相关知识;http框架的一般设计;http框架的优化手段;企业实践 课后作业:分层设计、路由的其它实现方式。。。。。