飞哥的技术号“开发内功修炼”更新文章已有一年多,过去的文章多为单个技术点的深度剖析,缺少一个系统性的全局视角。这难免让部分读者在阅读某些篇章时产生困惑。今天为大家带来的这本电子书,旨在呈现我关于网络性能研究的整体脉络与核心思路。
举个例子,我曾写过一篇关于 内核在内存使用上“开小灶” 的文章。有读者就提出疑问:如此深入地研究内核内存管理,在实际工作中究竟有何应用价值?
其实,我的选题并非随意为之,而是很早就有了清晰的规划。以网络篇为例,其核心目标可以概括为“理解网络性能”。在明确了这一目标后,我将任务拆解为性能的三个核心维度:CPU开销、内存开销和时间开销。
以CPU维度为例,我需要彻底搞清楚一个网络数据包是如何从网卡进入内核的,内核又是通过何种机制通知用户进程的。只有理清这些底层流程,才能真正把握网络对CPU资源的消耗本质。对于内核和内存维度的研究亦然,必须深入到内核对象层面,才能准确评估一条TCP连接的真实内存占用。
为此,我将过去所有网络相关的文章进行了系统性的汇总与梳理,并补充了性能优化实践、前沿技术展望等新内容,最终整理成这本电子书,命名为 《理解了实现再谈网络性能》。通过这本书,你将能够更清晰地把握网络性能优化的全貌与精髓。
为何要修炼技术内功?
让我先分享一个观察。在我的技术交流群里,曾有同学提到面试时被面试官质疑:“你是来应聘PHP开发的,懂IO多路复用有什么用?” 我只能说,这位面试官自身的眼界可能也局限于CURD层面。一名资深开发者如果连 epoll 这样的核心机制都不了解,当项目遭遇网络瓶颈或需要设计高并发方案时,又该如何进行有效的优化与选型呢?
当前业界的许多技术学习过于追求“花拳绣腿”式的框架和工具,严重缺乏对底层内功的重视,上述面试官便是一个缩影。高性能PHP异步网络引擎Swoole的作者韩天峰曾指出,许多程序员的学习路径存在严重缺陷——直接从Linux、PHP、MySQL等工具上手做项目,中级学框架,高级学架构,却普遍忽视了计算机基础。这好比练武只求招式速成,不修炼内功心法,成就终究有限。
事实上,圈内的顶尖高手,如韩天峰、PHP7核心开发者鸟哥,无一不是内功极其深厚之人。他们的强大并非源于掌握了多少时髦框架,而是对底层原理有深刻理解。以小见大,鸟哥在PHP7中将HashTable结构体从72字节优化至56字节,看似微小的改动,却带来了数倍的性能提升。原因在于CPU读取内存是以缓存行(Cache Line,通常64字节)为单位进行的。56字节可被一次性载入,而72字节则需要两次读取,同时L1/L2/L3缓存的命中率也会大幅提升。这正是深谙CPU工作原理后带来的精准优化。
内功修炼或许不会教你最新的编程语言或火热的人工智能框架,但我坚信这是通往技术高层的必经之路。修炼内功的益处主要体现在以下几点:
-
技术生命周期长:以Linux操作系统为例,自1991年诞生至今依然蓬勃发展。相比之下,应用层的许多框架和工具生命周期短得多。将全部精力押注在快速更迭的技术上,难免会陷入知识焦虑。沉下心来打磨内功,是应对技术行业变化与职业焦虑的一剂良方。
-
理解新技术更快:不必说业界大牛,仅以我自身的体验为例。在我深入研究了内核的文件读取、网络包处理流程后,即便没有翻阅Kafka源码,也能瞬间理解其在网络性能上表现出色的原因。同样,弄懂了 epoll 的内部实现,再回头看Golang的net包,才能真正领略其网络I/O封装的精妙绝伦。精通Linux内核,再看上层技术,犹如拥有了透视能力。
-
内核是优秀系统设计的典范:Linux作为一个历经千锤百炼的系统,蕴含了无数世界顶级的设计与实现方案。我们在日常业务开发中,完全可以借鉴这些思想。例如,早期我负责的一个数据采集任务调度系统,其设计就部分参考了操作系统的进程调度算法;再如管理海量连接,epoll 内部“红黑树+就绪队列”的结构就提供了绝佳的参考模型。将这些经过实践检验的优秀设计融入自己的项目,能极大提升系统的健壮性与效率。
-
对性能的把握更精准:缺乏扎实的内功,很难触及性能问题的本质。多数开发者凭经验知道“A方案比B快”,但往往说不清“为什么”。如果理解了底层运作机制,你对性能的评估将更加精准,在进行性能优化或技术选型时也会更加胸有成竹,游刃有余。
时髦的技术终会过时,但扎实的内功将伴随你的整个职业生涯。只有具备深厚的内功底蕴,才能在技术道路上走得更稳、更远。
网络篇电子书的诞生:从困惑到求索
我曾听到一种观点:“学习网络就是学习各种协议”。这种说法误导了许多人。提及计算机网络,大家首先想到的往往是OSI七层模型、IP/TCP/UDP/HTTP协议、三次握手、滑动窗口、HTTP方法等知识。
这些理论固然重要,却无法解答我在实际工作中遇到的具体困惑:
-
TIME_WAIT连接的真实开销:运维同事曾紧急反馈,某线上服务器出现3万多个TIME_WAIT状态连接,并迅速通过调整 tcp_tw_reuse 等参数解决了问题。但我的思考并未停止:一条TIME_WAIT连接究竟消耗哪些资源?是端口占用导致新连接无法建立,还是过多消耗了内存?3万条这个数量级,究竟该视为警告还是严重错误?
-
空闲长连接的开销:在公司尚未建立统一的Redis平台时,业务自行维护了一组Redis服务器。为了减少握手开销,我们使用了长连接,导致单个Redis实例上建立了约6000条空闲连接。我一直在思考:一条空闲的 TCP 连接 到底有哪些开销?这6000条连接是否会压垮服务器?虽然监控显示运行平稳,但其背后的原理我始终未能完全吃透。
-
连接数限制的争议:另一次优化中,业务需要将访问MySQL的短连接改为长连接。当时公司的MySQL平台需要为每个IP申请并发数。由于使用php-fpm且无连接池,我们需要申请与fpm进程数(200个)相等的并发数。平台方同事对此表示担忧:“单机200并发太高了”。虽然我最终用上述Redis的例子说服了他,但我内心对“空闲TCP连接的开销究竟在哪”这个问题,仍然没有确切的答案。
这些实践中的困惑让我意识到一个关键问题:业界对计算机网络知识的关注过多集中于协议理论层面,而对于网络在操作系统内核中是如何被实现、其CPU与内存开销具体如何,却普遍缺乏深入的理解。
举个简单的例子,在“高并发”被广泛讨论的今天,“一台服务器到底能支持多少条 TCP 连接”本应是一个基础问题。然而,当我产生疑问后,无论是在网络搜索还是在经典书籍中,都难以找到令人满意的、基于实现细节的答案。许多文章含糊其辞,讨论所谓的“C10K”、“C1000K”问题,但看完后仍然不知道具体的极限在哪里,更不用说搞清楚一条连接具体占用多少内存了。
因此,我下定决心,要从实现层面将计算机网络彻底剖析清楚,搞明白网络的CPU开销与内存开销究竟从何而来。“开发内功修炼”网络篇系列文章便是在此背景下诞生,并最终凝结成了这本 《理解了实现再谈网络性能》 电子书。
《理解了实现再谈网络性能》电子书目录概览
引言
- 作者简介
- 马上35岁,我该不该焦虑
- 目前业界技术文章的问题
- 飞哥深入研究网络的出发点
- 适用读者
一、TCP连接的CPU开销
- 1.1 Linux是如何接收一个网络包的
- 1.2 UDP下用户进程如何和内核协同?
- 1.3 TCP下用户进程如何和内核协同?
- 1.4 IO多路复用Epoll内部实现
- 1.5 网络包处理之CPU开销汇总
二、TCP连接的内存开销
- 2.1 内核对象是如何使用内存的
- 2.2 实验测试TCP连接内存开销
- 2.3 一台服务器最大可以支撑多少条TCP连接
- 2.4 一台客户端可以支撑多少条TCP连接
- 2.5 实验单机100万TCP连接的源码
三、TCP连接的时间开销
- 3.1 正常TCP连接建立过程
- 3.2 TCP连接建立时的异常情况
- 3.3 TCP连接耗时实测
四、Linux网络性能优化建议
- 4.1 耗时优化建议
- 4.2 内存优化建议
- 4.3 CPU优化建议
五、项目实际问题分析
六、前沿技术展望
七、推荐书单
电子书获取方式
首先,请允许我说明,我并未将电子书直接置于网盘供随意下载。原因有二:其一,我希望这本书能真正得到读者的认可,并值得你分享给身边的同事与朋友;其二,太过轻易获得的东西,往往容易被束之高阁,这也是我不愿看到的。
因此,我设置了一个小小的获取门槛,您只需满足以下任意一个条件即可:
- 方式一:将本文分享至朋友圈,并附上一句简短的推荐语(几个字即可),然后添加我的微信,我将通过微信发送电子书给您。
- 方式二:将本公众号“开发内功修炼”推荐给您身边的两位朋友(需为近期两天内新关注的用户),添加我的微信并告知您好友的微信昵称。
完成以上任意一项,即可获得电子书。并且,只要完成一次,在电子书后续更新升级时,您都将自动享有获取最新版本的权益。
如果您认可这本书所探讨的方向与价值,相信完成这个小任务并不会给您带来负担。书中内容虽经反复校对,但难免存在疏漏之处,如您发现任何描述不准确的地方,欢迎随时指正。
对 网络协议、系统内核 及 性能调优 等底层技术感兴趣的开发者,欢迎关注和参与 云栈社区 的讨论,这是一个专注于后端架构、网络、系统及计算机基础知识的开发者社区。
Github项目地址: https://github.com/yanfeizhang/coder-kung-fu