讲个程序员的故事给你听
从前,有一群码农小伙伴,他们中有快乐的码农,当然也有不快乐的,但对于他们都是码农这一点,是毫无疑问的。
踏着互联网浪潮,他们玩起了网络程序,首先他们需要写一个网络库(为什么他们不用开源网络库呢?额,这是个好问题,因为这样那样的原因,我们先暂时对这个问题视而不见吧)。码农一号当仁不让的承担起了这个艰巨的任务。
这是一个linux下的server程序,一号baidu查了些资料,知道要用epoll来写。让我们提前做一个预设,在客观条件恒定的情况下,单线程epoll性能极限能跑到100QPS,大部分玩转网络编程的程序员能写到80+。一号费了九牛二虎之力,但鉴于能力有限只写到了10。我草,这没法交活啊。业务需求在20+啊。于是一号开始了性能调优。他把水平触发改成了边缘触发,他改出了一个磕磕绊绊山寨版的one loop per thread的多线程版,他甚至在每个线程中都毫无目的的人为sleep了一下(请原谅我举了一个这么弱智的例子,大家可以自行脑补一个更合适的)。经过漫长的开发,4个epoll线程QPS跑到了30!!!
老大很高兴,二号酸溜溜,三号事不关己,四号对一号的敬仰如滔滔江水。。。总之,他们都或真心或假意的对一号恭维了一番。
一号开始得瑟了,逮谁跟谁聊网络编程。“epoll要想高并发就得边缘触发”、“不多线程吞吐量就上不来”、“关键就在于那个sleep,不然低时延没戏”。
老大是个线程控,对多线程这点很认同,”边缘触发?听起来好像是高级一点“,但他大概也知道sleep那地方有点不对头,他曾咨询式的向一号提议是否去了会更好。“那怎么行,这可是成功的关键啊“,一号怒答到。对于一号来说,sleep是他苦思冥想、釜底抽薪的神来之笔,他不允许别人对它有任何的质疑。老大曾试图屏蔽掉sleep,但由于代码实在太耦合了,注释掉sleep程序就编译不过去了。。。”算逑吧,能跑到30就行了,上线吧,管那么多呢“,老大释然的想到。
团队在慢慢扩大,新来了一位从一线公司出来的三线程序员。带着一线公司出身的优越感,他对小伙伴们的鄙视总是由内自外、有意无意的流露出来,甚至是对老大!!!偶然他得知了网络库这项目,没见过猪跑,但吃过猪肉啊。他知道单线程epoll能跑到80+,急于证明自己的他申请重写网络库。但鉴于他三线程序员的角色设定——眼高手低,东西始终出不来,又由于到处结怨,最后被小伙伴们幸灾乐祸的排挤走了。。。
团队继续扩大,来了位真正的高手,他技术高超,为人谦逊,脚踏实地,干了不少硬活。随着业务持续增长,老网络库HOLD不住了。他轻描淡写的用多线程管理多个libevent-base将QPS提升到了400QPS。从此小伙伴们都对他倚重有佳,即使是”专家一号“——真心假意就只有他自己知道了。。