-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
和标准库的差异? #16
Comments
异步难点传统异步的难点主要包括两方面
异步流解析需要异步处理半包,涉及半包缓存、新数据来了后的拼接、解析流程的状态机等,这些都比同步解析要麻烦的多。因为同步解析可以根据协议特点,当前需要几个字节就去阻塞读几个字节出来,解析逻辑是同步的,自上而下、逻辑简单。而异步解析,没法自己需要几个字节就阻塞读几个字节,只能等下次来新数据了再解析,下次来的数据够不够也不敢保证 内存优化标准库同步方案的内存池优化策略也不一样,主要区别在两方面:
二是2^N size的不适用:
再有就是不同协议层之间的内存池复用,llib主要是为nbio的tls做的标准库tls魔改,网络层次,咱们用的tcp/tls/http/websocket,4-7层,如果各个层单独一个内存池,也可能是用量加倍,所以nbio是高度定制了这个4-7,都复用同一个内存池了,尽量复用 c/c++那些是直接malloc/free,或者也可以jemalloc/tcmalloc那些来做,并且c/c++没有runtime,虚拟内存的分配释放相对及时、更可控。golang毕竟不同,即使不用了也一来runtime gc,异步流解析+内存池的实现其实跟c/c++之类的相比,难度并不算大 |
感谢作者的解答!作者是把tcp/tls/http/websocket 协议 做了统一适配解析啊。。ORZ,2^N size的buffer 是源自于fasthttp的?还有不知道作者研究过netpoll的LinkBuffer?。 |
这个是指统一的buffer pool
nbio没有使用 2^N,我上面解释了的,2^N 不适用异步库。2^N源于哪里我没有去考究,因为标准库里也有一些地方是这种
这里有一份benchmark,包括net、netpoll、nbio、gnet的对比,其他的一些poller仓库比如evio和其他一些国内作者的仓库我之前测试过,吞吐率都不及gnet,所以没有加入到代码中。issue里的截图数据是我自己环境跑的结果,你可以在自己环境实测为准,然后再看看各个方案的效果: 所以我建议是不要看各个benchmark仓库自己提供的数据,而是自己实测好些,包括基于netpoll的kitex框架: 单就LinkBuffer而言,其实用处不大,反倒使代码逻辑复杂化了、易用性降低了、性能可能下降(至少我实测得到的结论是netpoll的吞吐率是标准库和几个框架里最低的) |
以写为例,通常直接写入fd就可以了,只有socket写缓冲区满等少数情况才会需要先缓存起来然后等待可写事件再写入,绝大多数情况都是直接把buffer写入就ok了,所以直接buffer更简单搞笑、根本不太需要LinkBuffer的。有一些框架用的是RingBuffer,也是同样道理。数据结构并不是看上去高级就一定效果好,得根据实际使用场景考虑具体的得失 而且根据实测效果,压测时netpoll的内存占用是其他方案甚至几十倍,比如别人占用几十M、netpoll占几个G,我压测是去年做的,不知道他们后续的版本有没有优化或者修复 哦看了下,你也是字节的呀,刚好,有兴趣的话可以实测下,顺便也帮我看下会不会是我测试的netpoll代码有问题,如果有问题帮我更正下。。。 |
嗯了解的,最近也在看fasthttpp的源码,顺道提了句。
是的,不过我不是基架那边的同学 :),目前在学习协议和网络编程,看了下各大go的各大网络框架,目前发现只有nbio支持异步tls。比较好奇~,感谢作者的耐心解答
目前正在看gnet/netpoll/nbio的实现^^, 后续会实测验证下。 |
可能是因为 fasthttp 作者把 2^N 单独开源了个仓库,所以关注的人比较多 |
hi,非常感谢开源这么优秀的网络库。
我理解golang官方的tls标准库适配net模型,使用的同步模型,为适配nbio,作者应该是改为了异步的方式,想了解下,改为异步的思路?我理解难点在于内存的分配,想知道作者的解决/优化思路?
The text was updated successfully, but these errors were encountered: