理解了实现再谈网络性能-202202更新
资源内容介绍
理解了实现再谈网络性能-202202更新 <link href="/image.php?url=https://csdnimg.cn/release/download_crawler_static/css/base.min.css" rel="stylesheet"/><link href="/image.php?url=https://csdnimg.cn/release/download_crawler_static/css/fancy.min.css" rel="stylesheet"/><link href="/image.php?url=https://csdnimg.cn/release/download_crawler_static/89632665/raw.css" rel="stylesheet"/><div id="sidebar" style="display: none"><div id="outline"></div></div><div class="pf w0 h0" data-page-no="1" id="pf1"><div class="pc pc1 w0 h0"><img alt="" class="bi x0 y0 w1 h1" src="/image.php?url=https://csdnimg.cn/release/download_crawler_static/89632665/bg1.jpg"/><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">理 解 了 实 现 再 谈</div><div class="t m0 x3 h3 y3 ff1 fs0 fc0 sc0 ls0 ws0">⽹ 络 性 能</div><div class="t m0 x4 h4 y4 ff1 fs1 fc0 sc0 ls0 ws0">开 发 内 功 修 炼 之 ⽹ 络 篇</div><div class="t m0 x5 h4 y5 ff1 fs1 fc0 sc0 ls0 ws0">张 彦 ⻜</div><div class="t m0 x6 h5 y6 ff1 fs2 fc0 sc0 ls0 ws0">最后更新时间:2022-02-01</div><div class="t m0 x7 h5 y7 ff1 fs2 fc0 sc0 ls0 ws0">添加⽹络包发送过程分析</div><div class="t m0 x8 h6 y8 ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 x8 h6 y9 ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 x8 h6 ya ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 x8 h6 yb ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 x8 h7 yc ff3 fs3 fc1 sc0 ls0 ws0">Github<span class="ff4">:<span class="ff2 fc2">https://github.com/yanfeizhang/coder-kung-fu</span></span></div></div><a class="l"><div class="d m1"></div></a></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div><div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="/image.php?url=https://csdnimg.cn/release/download_crawler_static/89632665/bg2.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x8 h8 yd ff5 fs3 fc1 sc0 ls0 ws0">技术群<span class="ff4">:加作者微信<span class="ff2"> zhangyanfei748527</span>,我来拉⼤家!<span class="ff2"> </span></span></div><div class="t m0 x8 h6 ye ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 x9 h9 yf ff4 fs4 fc1 sc0 ls0 ws0">引<span class="ff2"> </span>⾔<span class="_ _0"> </span><span class="ff2 fc2"> </span></div><div class="t m0 xa ha y10 ff4 fs5 fc1 sc0 ls0 ws0">作者简介<span class="_ _1"> </span><span class="ff2 fc2"> </span></div><div class="t m0 x8 h7 y11 ff4 fs3 fc1 sc0 ls0 ws0">⼤家好,我是张彦⻜,⼤家都喜欢称呼我⻜哥。我于<span class="ff2"> 2010 </span>年<span class="ff2"> 7 </span>⽉从⻄北⼤学计算机学院硕⼠</div><div class="t m0 x8 h7 y12 ff4 fs3 fc1 sc0 ls0 ws0">毕业,之后⼀直混迹于帝都。刚毕业时因为户⼝的问题去了⼀家⼴播电视软件⻰头公司,但</div><div class="t m0 x8 h7 y13 ff4 fs3 fc1 sc0 ls0 ws0">按捺不住对互联⽹的向往,在<span class="ff2"> 2011 </span>年就跳槽去了腾讯。后来随着腾讯和搜狗的战略联姻,被</div><div class="t m0 x8 h7 y14 ff4 fs3 fc1 sc0 ls0 ws0">⽼板连⼈带业务⼀并注⼊到搜狗。现在在搜狗任专家开发⼯程师,负责<span class="ff2"> PC </span>浏览器、搜狗⼿</div><div class="t m0 x8 h7 y15 ff4 fs3 fc1 sc0 ls0 ws0">机助⼿等产品的后端技术。</div><div class="t m0 x8 h7 y16 ff4 fs3 fc1 sc0 ls0 ws0">我在这⼗多年的⼯作中有不少的技术思考,因此创办了「开发内功修炼」技术号,分别在微</div><div class="t m0 x8 h7 y17 ff4 fs3 fc1 sc0 ls0 ws0">信公众号和知乎两个平台发布。这本电⼦书是我之前所发布的⽹络相关⽂章的⼀个总结,在</div><div class="t m0 x8 h7 y18 ff4 fs3 fc1 sc0 ls0 ws0">⽹络⽂章的基础上理顺了整本电⼦书的架构,也添加了⼀些⽹络开发优化建议、实际问题分</div><div class="t m0 x8 h7 y19 ff4 fs3 fc1 sc0 ls0 ws0">析等章节。</div><div class="t m0 xb ha y1a ff4 fs5 fc1 sc0 ls0 ws0">⻢上<span class="ff2"> 35 </span>岁,我该不该焦虑<span class="_ _2"> </span><span class="ff2 fc2"> </span></div><div class="t m0 x8 h7 y1b ff4 fs3 fc1 sc0 ls0 ws0">之前⽹络在爆炒⼀篇标题为《互联⽹不需要中年⼈》,疯狂渲染<span class="ff2"> 35 </span>岁的码农的前程问题,制</div><div class="t m0 x8 h7 y1c ff4 fs3 fc1 sc0 ls0 ws0">造焦虑。本来我觉得这个事情应该只是媒体博眼球的⼀个炒作⽽已。不过恰恰最近⾯试了有<span class="ff2"> </span></div><div class="t m0 x8 h7 y1d ff2 fs3 fc1 sc0 ls0 ws0">70 <span class="ff4">多⼈,其中有很多⼯作</span> 7, 8 <span class="ff4">年以上的的同学。</span> </div></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div><div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="/image.php?url=https://csdnimg.cn/release/download_crawler_static/89632665/bg3.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x8 h7 y1e ff4 fs3 fc1 sc0 ls0 ws0">这些⼈⾥基本上可以⾮常明确地划分成两类。第⼀类是虽然⼯作了<span class="ff2"> 7, 8 </span>年以上了,但是所有</div><div class="t m0 x8 h7 y1f ff4 fs3 fc1 sc0 ls0 ws0">的经验都集中在业务层。换句话说,并不是有<span class="ff2"> 7 - 8 </span>年经验,⽽是⼯作了<span class="ff2"> 7 - 8 </span>年⽽已。稍微</div><div class="t m0 x8 h7 y20 ff4 fs3 fc1 sc0 ls0 ws0">深⼊问⼀点性能相关的问题都没有好的思路,技术能⼒并没有随着⼯作年限的增⻓⽽增⻓。</div><div class="t m0 x8 h7 y21 ff4 fs3 fc1 sc0 ls0 ws0">也确实为这种类型的同学的前途感到担忧。另外⼀类同学都是除了业务的开发以外,还会额</div><div class="t m0 x8 h7 y22 ff4 fs3 fc1 sc0 ls0 ws0">外抽时间注重⾃⼰的技术积累,成⻓的就⽐较好,对于他们我觉得别说<span class="ff2"> 35 </span>岁了,<span class="ff2">45 </span>岁也仍</div><div class="t m0 x8 h7 y23 ff4 fs3 fc1 sc0 ls0 ws0">然会是团队的中流砥柱。</div><div class="t m0 x8 h7 y24 ff4 fs3 fc1 sc0 ls0 ws0">对于第⼀类同学来讲,技术成⻓过慢也不完全是他们⾃⼰的原因。现在国内的开发环境中都</div><div class="t m0 x8 h7 y25 ff4 fs3 fc1 sc0 ls0 ws0">存在着⼀个普遍的⽭盾,那就是排期过满的需求开发和需要⼤把时间去磨练技术的⽭盾。<span class="ff2"> </span>排</div><div class="t m0 x8 h7 y26 ff4 fs3 fc1 sc0 ls0 ws0">期过满导致开发同学平时绝⼤部分的时间都是在处理各种各样的业务逻辑和<span class="ff2"> bug </span>。很多同学</div><div class="t m0 x8 h7 y27 ff4 fs3 fc1 sc0 ls0 ws0">的时间全部被这种需求吃掉了,导致没有想法或精⼒去提升⾃⼰的底层技术能⼒,导致技术<span class="ff2"> </span></div><div class="t m0 x8 h7 y28 ff2 fs3 fc1 sc0 ls0 ws0">level <span class="ff4">并没有随着⼯作年限⽽同⽐增⻓。</span> </div><div class="t m0 x8 h7 y29 ff6 fs3 fc1 sc0 ls0 ws0">︎︎︎︎<span class="ff2"> udp_rcv </span>︎<span class="ff4">平时⼤家都是⽤各种语⾔进⾏业务逻辑的代码编写,⽆论你⽤的是<span class="ff2"> PHP</span>、<span class="ff2">Go</span>、还</span></div><div class="t m0 x8 h7 y2a ff4 fs3 fc1 sc0 ls0 ws0">是<span class="ff2"> Java</span>,都是属于应⽤层的范畴。但是应⽤层是建⽴在物理层和内核层之上的。如果遇到⼀</div><div class="t m0 x8 h7 y2b ff4 fs3 fc1 sc0 ls0 ws0">些性能问题的时候,很可能需要你对底层有⾜够深的理解,才能够有效优化性能或排除线上</div><div class="t m0 x8 h7 y2c ff4 fs3 fc1 sc0 ls0 ws0">故障。内核和物理层的知识往往⼜⽐较难吃透,不投⼊⾜够多的时间是难有⼤的突破。</div><div class="t m0 x8 h7 y2d ff4 fs3 fc1 sc0 ls0 ws0">我把在应⽤层的技术能⼒称之为外功,把<span class="ff2"> Linux </span>内核、设备物理结构称之为内功。我想⼤家的</div><div class="t m0 x8 h7 y2e ff4 fs3 fc1 sc0 ls0 ws0">外功能⼒已经都⾜够优秀了,但是⼀部分同学的内功能⼒却严重不⾜。</div><div class="t m0 x8 h7 y2f ff4 fs3 fc1 sc0 ls0 ws0">我的技术号的名称之所以命名为开发者内功修炼,就是想把我在内核、物理层上的⼀些理解</div><div class="t m0 x8 h7 y30 ff4 fs3 fc1 sc0 ls0 ws0">思考总结分享给⼤家,帮助这些同学提升⾃⼰的技术⽊桶短板。</div><div class="t m0 x8 h7 y31 ff4 fs3 fc1 sc0 ls0 ws0">在本书中,我会从应⽤层的问题出发,深⼊到<span class="ff2"> Linux </span>中进⾏分析。帮助⼤家提升对底层的理</div><div class="t m0 x8 h7 y32 ff4 fs3 fc1 sc0 ls0 ws0">解,加强你的技术深度,也为你的中年焦虑症送上⼀剂良药。</div><div class="t m0 x8 h6 y33 ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 xc ha y34 ff4 fs5 fc1 sc0 ls0 ws0">⽬前业界技术⽂章的问题<span class="_ _3"> </span><span class="ff2 fc2"> </span></div><div class="t m0 x8 h7 y35 ff4 fs3 fc1 sc0 ls0 ws0">相信很多同学也都保持着在互联⽹上进⾏学习的习惯,我但我觉得⽬前⼤多数的技术类⽂章</div><div class="t m0 x8 h7 y36 ff4 fs3 fc1 sc0 ls0 ws0">还是太偏向于各种花拳绣腿了。</div></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div><div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="/image.php?url=https://csdnimg.cn/release/download_crawler_static/89632665/bg4.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x8 h7 y37 ff4 fs3 fc1 sc0 ls0 ws0">⾼性能的<span class="ff2"> PHP </span>异步⽹络通信引擎<span class="ff2"> swoole </span>的作者韩天峰说过,很多程序员职业规划的⽂章,</div><div class="t m0 x8 h7 y38 ff4 fs3 fc1 sc0 ls0 ws0">上来就是<span class="ff2"> Linux</span>、<span class="ff2">PHP</span>、<span class="ff2">MySQL</span>、<span class="ff2">Nginx</span>、<span class="ff2">Redis</span>、<span class="ff2">Memcache</span>、<span class="ff2">jQuery </span>这些,然后就直接</div><div class="t m0 x8 h7 y39 ff4 fs3 fc1 sc0 ls0 ws0">上⼿搭环境、做项⽬,中级就是学习各种<span class="ff2"> PHP </span>框架和类库,⾼级阶段就是<span class="ff2"> MySQL </span>优化、</div><div class="t m0 x8 h7 y3a ff2 fs3 fc1 sc0 ls0 ws0">PHP <span class="ff4">内核与扩展、架构设计这些了。这些⽂章都存在⼀个严重的缺陷,不重视基础。就好⽐</span></div><div class="t m0 x8 h7 y3b ff4 fs3 fc1 sc0 ls0 ws0">练武功,只求速成,不修炼内功和⼼法,只练各种招式,这样练出来的⾼⼿能⾼到哪⾥去?</div><div class="t m0 x8 h7 y3c ff4 fs3 fc1 sc0 ls0 ws0">事实上,码农圈⾥的⽜⼈⽐如韩天峰,⽐如<span class="ff2"> PHP7 </span>作者⻦哥,他们都具备⾮常⾮常扎实的基</div><div class="t m0 x8 h7 y3d ff4 fs3 fc1 sc0 ls0 ws0">础,他们之所以⽜,并不是他们掌握的花拳绣腿的功夫多,⽽是内功⾮常⾮常深厚。举个⼩</div><div class="t m0 x8 h7 y3e ff4 fs3 fc1 sc0 ls0 ws0">例⼦,⻦哥在<span class="ff2"> PHP7 </span>中把<span class="ff2"> HashTable </span>结构体从<span class="ff2"> 72 </span>字节压缩到了<span class="ff2"> 56 </span>字节,表⾯看起来不⼤的</div><div class="t m0 x8 h7 y3f ff4 fs3 fc1 sc0 ls0 ws0">优化,实际上是成倍的性能提升。因为<span class="ff2"> CPU </span>在向内存要数据的时候是以<span class="ff2"> Cache Line </span>为单位</div><div class="t m0 x8 h7 y40 ff4 fs3 fc1 sc0 ls0 ws0">进⾏的,⼀个<span class="ff2"> Cache Line </span>是<span class="ff2"> 64 </span>字节。<span class="ff2">56 </span>字节可以⼀次请求搞定,⽽原来的<span class="ff2"> 72 </span>字节则需要</div><div class="t m0 x8 h7 y41 ff4 fs3 fc1 sc0 ls0 ws0">两次。另外就是<span class="ff2"> L1/L2/L3 </span>的命中率也会提升很多,这个对性能的帮助更⼤。</div><div class="t m0 x8 h7 y42 ff4 fs3 fc1 sc0 ls0 ws0">内功它不帮助你掌握最新的开发语⾔,也不教会你时髦的框架,也不会带你⾛进⽕热的⼈⼯</div><div class="t m0 x8 h7 y43 ff4 fs3 fc1 sc0 ls0 ws0">智能。但是我相信它是你成为⼤⽜的必经之路。我简单列⼀下锻炼内功的好处:</div><div class="t m0 x8 h7 y44 ff2 fs3 fc1 sc0 ls0 ws0">1<span class="ff4">)内功⽅⾯的技术⽣命周期⻓。</span>Linux <span class="ff4">操作系统</span> 1991 <span class="ff4">年就发布了,现在还是发展的如⽇中</span></div><div class="t m0 x8 h7 y45 ff4 fs3 fc1 sc0 ls0 ws0">天。对于作者<span class="ff2"> Linus</span>,我觉得他也有年龄焦虑。但他可能焦虑的找不到接班⼈。反观应⽤层的</div><div class="t m0 x8 h7 y46 ff4 fs3 fc1 sc0 ls0 ws0">⼀些技术尤其是很多的框架,⽣命周期能超过⼗年我就已经觉得他很⽜叉了。如果你的精⼒</div><div class="t m0 x8 h7 y47 ff4 fs3 fc1 sc0 ls0 ws0">全部押宝在这些⽣命周期很短的技术上,你说能不焦虑吗!所以我觉得戒掉浮躁,踏踏实实</div><div class="t m0 x8 h7 y48 ff4 fs3 fc1 sc0 ls0 ws0">练好内功打好是你对抗中年焦虑的解药之⼀。</div><div class="t m0 x8 h7 y49 ff2 fs3 fc1 sc0 ls0 ws0">2<span class="ff4">)内功深厚的⼈理解新技术⾮常快。拿我⾃⼰来举两个⼩例⼦吧。我其实没怎么去翻过</span> </div><div class="t m0 x8 h7 y4a ff2 fs3 fc1 sc0 ls0 ws0">kafka <span class="ff4">的源码。但是当我研究完了内核是如何读取⽂件的、内核处理⽹络包的整体过程后,</span></div><div class="t m0 x8 h7 y4b ff4 fs3 fc1 sc0 ls0 ws0">就秒懂了<span class="ff2"> kafka </span>在⽹络这块为啥性能表现很突出了。另外⼀个是当我理解了<span class="ff2"> epoll </span>的内部实</div><div class="t m0 x8 h7 y4c ff4 fs3 fc1 sc0 ls0 ws0">现以后,回头再看<span class="ff2"> Golang </span>的<span class="ff2"> net </span>包,才切切实实看懂了地球上绝顶精妙的对⽹络<span class="ff2"> IO </span>的封</div><div class="t m0 x8 h7 y4d ff4 fs3 fc1 sc0 ls0 ws0">装。所以<span class="ff2"> Linux </span>内核你真的弄懂了的话,再看应⽤层的各种新技术就犹如带了透视镜⼀般,直</div><div class="t m0 x8 h7 y4e ff4 fs3 fc1 sc0 ls0 ws0">接看到⻣骼。</div><div class="t m0 x8 h7 y4f ff2 fs3 fc1 sc0 ls0 ws0">3<span class="ff4">)内核提供了优秀系统设计的实例。</span>Linux <span class="ff4">作为⼀个千锤百炼的系统,其中蕴含了⼤量的世</span></div><div class="t m0 x8 h7 y50 ff4 fs3 fc1 sc0 ls0 ws0">界顶级的设计和实现⽅案。平时我们在⾃⼰的业务开发中,在编码之前也需要先进⾏设计。</div><div class="t m0 x8 h7 y51 ff4 fs3 fc1 sc0 ls0 ws0">⽐如我在刚⼯作的时候负责的⼀个数据采集任务调度,其中的实现就是部分参考了操作系统</div><div class="t m0 x8 h7 y52 ff4 fs3 fc1 sc0 ls0 ws0">进程调度⽅案。再⽐如如何在管理海量的连接的情况下仍然能⾼效发现某⼀条连接上的<span class="ff2"> IO </span>事</div><div class="t m0 x8 h7 y53 ff4 fs3 fc1 sc0 ls0 ws0">件,<span class="ff2">epoll </span>内部的红⿊树<span class="ff2"> + </span>队列的组合可以提供给你⼀个很好的参考。这种例⼦还有很多很</div><div class="t m0 x8 h7 y54 ff4 fs3 fc1 sc0 ls0 ws0">多,总之如果能将<span class="ff2"> Linux </span>的某些优秀实现,搬到你的系统中会极⼤提升你的项⽬的实现⽔平。</div></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div><div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="/image.php?url=https://csdnimg.cn/release/download_crawler_static/89632665/bg5.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x8 h7 y55 ff4 fs3 fc1 sc0 ls0 ws0">时髦的东⻄终究会过时,但扎实的内功能⼒将会伴随你的⼀⽣。只有具备了深厚的内功底</div><div class="t m0 x8 h7 y56 ff4 fs3 fc1 sc0 ls0 ws0">蕴,你才能在你的发展道路上⾛的更稳、⾛的更远。</div><div class="t m0 x8 h6 y57 ff2 fs3 fc1 sc0 ls0 ws0"> </div><div class="t m0 xd ha y58 ff4 fs5 fc1 sc0 ls0 ws0">⻜哥深⼊研究⽹络的出发点<span class="_ _4"> </span><span class="ff2 fc2"> </span></div><div class="t m0 x8 h7 y59 ff4 fs3 fc1 sc0 ls0 ws0">其实我在刚⼯作前⼏年对计算机⽹络的理解也是不深的。</div><div class="t m0 x8 h7 y5a ff4 fs3 fc1 sc0 ls0 ws0">有⼈说,学习⽹络就是在学习各种协议,这种说法其实误导了很多的⼈。提到计算机⽹络的</div><div class="t m0 x8 h7 y5b ff4 fs3 fc1 sc0 ls0 ws0">知识点,你肯定也⾸先想到的是<span class="ff2"> OSI </span>七层模型、<span class="ff2">IP</span>、<span class="ff2">TCP</span>、<span class="ff2">UDP</span>,<span class="ff2">HTTP </span>等等。关于<span class="ff2"> TCP </span>再多</div><div class="t m0 x8 h7 y5c ff4 fs3 fc1 sc0 ls0 ws0">⼀点你也会想到三次握⼿、四次挥⼿、滑动窗⼝、流量控制。关于<span class="ff2"> HTTP </span>协议就是报⽂格式、<span class="ff2"> </span></div><div class="t m0 x8 h7 y5d ff2 fs3 fc1 sc0 ls0 ws0">GET/POST<span class="ff4">,状态码、</span>Cookie/Session <span class="ff4">等等。</span></div><div class="t m0 x8 h7 y5e ff4 fs3 fc1 sc0 ls0 ws0">但是我的这些知识却不能帮我清除我在⼯作中的如下⼏个疑惑。</div><div class="t m0 x8 h7 y5f ff2 fs3 fc1 sc0 ls0 ws0">1<span class="ff4">)有⼀次我们运维找过来,说某某⼏台线上机器上出现了</span> 3 <span class="ff4">万多个</span> TIME_WAIT<span class="ff4">,不⾏了得赶</span></div><div class="t m0 x8 h7 y60 ff4 fs3 fc1 sc0 ls0 ws0">紧处理哈。后来他帮我们打开了<span class="ff2"> tcp_tw_reuse </span>和<span class="ff2"> tcp_tw_recycle</span>,先把问题处理掉了。<span class="ff2"> </span></div><div class="t m0 x8 h8 y61 ff4 fs3 fc1 sc0 ls0 ws0">但是我的思考却并没有停⽌,<span class="ff5">⼀条<span class="ff3"> TIME_WAIT </span>到底会有哪些开销</span>。端⼝占⽤导致新连接⽆法</div><div class="t m0 x8 h7 y62 ff4 fs3 fc1 sc0 ls0 ws0">建⽴?还是会过多消耗机器上的内存?<span class="ff2"> 3 </span>万条<span class="ff2"> TIME_WAIT </span>究竟该算是<span class="ff2"> warning </span>还是<span class="ff2"> error</span>?</div><div class="t m0 x8 h7 y63 ff2 fs3 fc1 sc0 ls0 ws0">2<span class="ff4">)另外⼀次是当时公司还没有建⽴</span> redis <span class="ff4">平台之前,我们业务⾃⼰维护了⼀组</span> redis server </div><div class="t m0 x8 h7 y64 ff4 fs3 fc1 sc0 ls0 ws0">。为了节约握⼿开销,我们的业务进程对<span class="ff2"> redis </span>开启了⻓连接。这样⼀个<span class="ff2"> redis </span>实例上最终就</div><div class="t m0 x8 h8 y65 ff4 fs3 fc1 sc0 ls0 ws0">出现了<span class="ff2"> 6000 </span>条的连接。虽然每条连接上⼤部分时间都是空闲的,但是我却在思考<span class="ff5">⼀条空闲的</span></div><div class="t m0 x8 h8 y66 ff5 fs3 fc1 sc0 ls0 ws0">连接究竟会有哪些开销<span class="ff4">?这<span class="ff2"> 6000 </span>条连接会不会把服务器搞坏?<span class="ff2"> </span>当然最终观测的结果是没啥</span></div><div class="t m0 x8 h7 y67 ff4 fs3 fc1 sc0 ls0 ws0">问题,但是对于细节原理我仍然吃的不是很准。</div><div class="t m0 x8 h7 y68 ff2 fs3 fc1 sc0 ls0 ws0">3<span class="ff4">)另外⼀次也是我们业务要把短连接优化成⻓连接。但是这次涉及到了要访问公司的</span> Mysql </div><div class="t m0 x8 h7 y69 ff4 fs3 fc1 sc0 ls0 ws0">平台。当时我们公司的<span class="ff2"> Mysql </span>需要为每⼀个<span class="ff2"> ip </span>申请⼀个并发数。因为我们当时使⽤的是<span class="ff2"> </span></div><div class="t m0 x8 h7 y6a ff2 fs3 fc1 sc0 ls0 ws0">php-fpm<span class="ff4">,没有连接池的概念。所以我们有多少个</span> fpm <span class="ff4">进程,就得申请多⼤的并发数,我们</span></div><div class="t m0 x8 h7 y6b ff4 fs3 fc1 sc0 ls0 ws0">当时申请了<span class="ff2"> 200 </span>个。<span class="ff2"> </span>然后⼯程部的同学就过来<span class="ff2"> PK </span>了,你们这单机<span class="ff2"> 200 </span>个并发不⾏,太⾼</div><div class="t m0 x8 h7 y6c ff4 fs3 fc1 sc0 ls0 ws0">了。虽然我最终给他举了上⾯<span class="ff2"> redis </span>的例⼦,最终他同意了。虽然勉强说服了他,但是我仍然</div><div class="t m0 x8 h7 y6d ff4 fs3 fc1 sc0 ls0 ws0">吃不准空闲的<span class="ff2"> tcp </span>连接到底开销在哪⼉?</div></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>