提高h2吞吐
Open
enhancement
official
- Dominant language
- C++
- Stars
- 17.6k
- Forks
- 4.1k
- Avg merge
- 2d 12h
- Merged PRs (30d)
- 69
Description
目前的h2性能相比其他实现其实不算差,但是仍低于我们对其作为二进制协议的预期。这里的性能特指在多核+单连接下达到与brpc中其他二进制协议接近的QPS。
这里的一大问题是由于hpack的encode/decode是带状态的,且需要严格有序,所以h2的序列化和反序列化都需要在一个线程中完成,这块的代码的性能会比较明显地影响到很多线程(特别在benchmark中)。至于每个线程都可以并行跑的代码(如pb序列化、压缩etc)不在此issue考虑之列。
可改进的点有:
* 尽量不存储std::string。hash,equality-test都更慢,另外gcc 5之后的string是SSO,占据了32个字节。换成128-bit的hash code冲突会极低(我觉得64-bit就够了),同时性能也更好。不使用string还可以简H2UnsentRequest/Response::New中的准备代码,很多string拷贝都不必要了。
* 可以定点优化string_printf("%d", v)这种使用方法。这个在各种项目中出现的也不少了,一般可以从600ns降到100ns内。
* hpack中name-index和header-index最好能合并,那样只要seek一次,毕竟大部分情况一个header只会出现一次。
Contributor guide
Assessment
This issue has not been assessed yet.