对网络编程的思考

加入Spex接近两年,但是其实到今年七月份开始才真正做agent相关的工作,并且也是到最近才算是半只脚迈进对agent进行性能分析的部分;在做这一部分工作的时候,除了有“这一部分真有意思”的激动,同时也觉察出自己在网络编程方面知识和经验的欠缺,阻碍了对程序的优化 —— 而且这样的现象在组里其实比较普遍。

Spex agent的代码基本是一个proxy server(IO->逻辑处理->IO,既接收连接又对外创建连接), 服务端部分采用的是类似经典的reactor的事件处理模型。值得一提的是逻辑处理环节利用了Go的channel特性划分了几个阶段,这也给性能和代码逻辑分析带来了一定的挑战。

萌生对网络编程进行更系统化学习的起因是最近一次失败的性能优化尝试。在现有Spex agent的代码中,客户端部分(即作为client向外创建连接并交换数据的部分,这包括client agent向server agent建立TCP连接 & server agent向server instance建立UDS连接的部分)中是每个goroutine用一个for loop处理一个连接的序列化和I/O,我怀疑这部分可能会造成队头阻塞,就用goroutine pool来调用序列化和I/O。结果在和QA的简单验证下,发现延时P99并无法得到明显的改善,而与此同时系统的吞吐量下降了。

但并不是说这一个思路不正确就说明这个尝试失败了,而是在验证的过程中其实很大程度是不严谨的 —— 使用的是最基础的性能测试场景以及凭借自己猜测增加了请求包大小的测例,并没有尝试构建复现队头阻塞的场景,对于应该关注哪些指标,怎么看系统是否达到了瓶颈也有些无头苍蝇的感觉……当然这些问题其实都可以逐一地去研究并解决,但就是如果有更系统化的知识体系,这些问题本来也应该是很常见思路比较明确的问题,没有必要一个劲地瞎闯,还是需要更系统地学习网络编程。

之前也看了一些书,比如《UNP》、《Linux高性能服务器编程》,同时也有对Go HTTP的源码进行学习。但之前的学习没有领悟到一个比较重要的原则:抓大放小 —— 很容易就陷入到某一细分领域的某一个细节,但这往往在进行系统化学习的时候都是不重要且会分散注意力的。因此这些书的学习基本都虎头蛇尾,对于关键内容也没有清晰的认识和总结。

这次我选的核心阅读书目是陈硕的《Linux多线程服务器编程》,也是在许久之后把C++重新捡回来,为后面envoy相关的项目打一下基础。既然遵循抓大放小的原则,就对一些觉得是重点的内容深入代码和示例去看去运行,但不要去纠结小的点。同时CSAPP也是要继续学习,但这属于长时间的打地基工作,没必要说一定把CSAPP学完了自底向上都明白了再去接触和实际工程更接近的内容。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2024 Jeff
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信