心灵鸡汤151211

 

哥们别逗 了,写个脚本那真不叫运维自动化!

http://3060674.blog.51cto.com/3050674/1590803 

好久没写文章了,最近要来刷下存在感,近两 年,运维自动化被炒的火的不行,行业趋势不可挡,现在企业招运维工程师都要求会一门开发语言。我们公司也不例外,由于刚上市,一下子有钱了,开始招兵买马 瞎折腾,因此最近我也面试了不下十来个求职者,本成想可以很容易招到几个不错的小伙,结果却令我很失望,今天贴几个面试者例子上来,跟大家吐槽下:

 

面试A君:

应聘职位:高级系统工程师  , 工资要18K

此君简历写的不错,在360干过几年,简历上写的是维护公司的360网盘平台,管理着2000多台机器,写了很多自动化工具。然后我就让他跟我聊聊他做的自动化工具,哥们娓娓到来跟我讲他写的那些脚本(自动部署、批量命令、日志分析),从他的表情中感觉他好像觉得他做过的这些东西很牛B(其实都是一堆SHELL+PYTHON拼凑起来的粗糙工具,需求稍一改变就不能满足,脚本的扩展性极差),他说他现在的工作基本上80%都能通过脚本完成,说完后直视我,貌似是等待着我的认可,出于尊重,我只好说那确实不错。接下来我就拿他写过的批量并发执行命令的脚本跟他深入聊了下,他说这个脚本是Python多线程并发的,1000台机器执行一次批量命令1分钟就能全部完成,我于是让他给我讲讲多线程与多进程的区别,在什么时候用线程或进程更合适,结果哥们说了很多废话也没有讲明白。然后我又让他用PYTHON多线程给我写个简单的生产者消费者模型,哥们愣是不知道这是啥东西?那我又问,如果你不知道生产者消费者模型是什么,那你的并发异步处理是怎么做的?哥们语塞说没在这方面做过深入研究,我于是又问了几个其它方面的问题,比如他的Ngnix 日志是如何分析的?自动部署如何跟git结合的?监控报警接口是如何优化才降低误报率的?但回答的都不理想,然后,就没有然后了….。   在这里我只能说,我不是想打击他,如果你只是写了几个脚本就声称自己就是自动化大拿了,未免有点牵强。所以他被PASS掉了,因为我觉得把他招过来,真的不会给我们公司的自动化水平提高多少!

 

 

 

面试B君:

应聘职位:运维自动化开发工程师,  工资不能低于16K

此君简历上说他擅长PHP\Python开发,在原公司做过运维自动化平台。我很感兴趣,让他讲一下他做的东西,主要是监控平台和CMDB资产数据库,让他着重讲了一下他的监控架构,他说他的项目主要是主动监控方式,就是监控服务器每隔一两分钟去轮巡一次所有的机器的SNMP接口,把各机器的基本系统性能信息抓回来,再通过RRDTOOL出图。他们有500多台机器散落在3个不同地区的机房,我问他你们这种做主动监控轮巡一次得多少时间?他说1分 钟左右,我说如果轮巡过程中,如果有几台机器连不上怎么办?他说他的轮巡是并发的,连不上的不会影响其它机器的监控,我说但是你的线程池的线程个数是有限 的,有几个线程因为机器连不上,那就会产生阻塞直至超时,但在超时之前这几个线程是不会再空闲出来的,因此肯定会导致整个轮巡时间的加长呀。哥们想了想 说,确实存在这样的问题。然后我问他有没有考虑过用被动监控方式,就是让客户端自动汇报数据呢?他说当时他们也这样想过,但是一想到要在所有的机器上装个 客户就觉得会增加复杂度,并且维护和管理不容易。我说采用被动模式确实会增加点复杂度,但会给你带来很多好处呀,监控客户端自动给你的服务器汇报数据会大 大减少你主监控服务器的负载,并且可监控的东西要多的多呀,你还可以自定义插件,自动升级,并且还可以把监控客户端当做它用,比如自动化部署、任务下发 等。可能是出于尊重,哥们假装同意了我的看法。

 然后我又问他们的项目是几个人开发的,他说算他在内有3个人一块做,我说那你们之前是如何协作的,比如接口互相是如何调用和约定的?他说基本上是每个人写自己的接口,互相之间约定好如何调用。我问那你们有没有遵循什么标准?比如是统一用http api还是其它的?接口格式是统一用Json还是用XML 或其它?哥们说他们有的用JSON、有的用XML。我说你们没有用restful标准吗?哥们表示没听过。。。。。OH,好吧!如果大家开发时都不遵循一定的标准和规范,我真心不知道他们的系统以后如何扩展,不知道这个哥们离职后谁还能看懂他的代码?不知道这种拿一堆随心所意写出来的脚本来拼凑起来的所谓的系统能满足多少实际需求?

 

 

面试C君:

应聘职位:运维工程师    工资要求11K

 

哥们刚工作不到2年就要11K,真比我当时工作了2年挣的多多了(即使去掉通货膨胀影响),但如果技术好那也没有问题的。结果问了一堆基础问题都答不好,再要这些钱是否有点自不量力了?问他LVS,结果只是配置过,让他讲几种负载调度原理也讲不明白,问他平时怎么管理大量机器,他说用SaltStack 或自己批量写脚本,我问那你用脚本批量管理机器,是通过什么方式呢?他说是用SSH批量密钥登录,我说那你给我讲讲RSA密钥认证原理吧,他接下说的就是怎么通过ssh-keygen命令,怎么把公钥拷到客户端机器上等怎么实现密钥认证的过程。我打断他说我想听的是原理,不是认证方法,结果哥们一点都说不出来,接下来问的一些其它问题也是这样,只知其然,不知其所以然,最后我说,你这种情况我们给不了11K,如果低点你愿意考虑吗?哥们说不太会考虑,那。。。。好吧,只能打发他走了。

 

 

 

 

其 它的一些面试者情况也好不到哪里去,一路十多个面下来,让我很失望,本以为过了这么多年以后,整个行业的从业素质会提高很多。但结果却还是老样子,所以大 家可以想想业内大家都在炒的运维自动化到底实际有多水?如果从业人员技术水平都这样,还谈个妹自动化呢?自动化真的是写写脚本,再拿个开源软件拼拼凑凑下 就完了吗?在我看来这撑死了只能叫辅助运维,不叫自动化,自动化应该是真正的开始让机器帮你监测问题\发现问题\处理问题\解决问题\自我修复\自我维 护\自带干粮,各模块之间尽量低耦合\可扩展\可插拔。应该是真正能帮企业降低IT运 营成本,使运营成本可视化\可测量\可对比,应该是真正能减轻运维人员的工作量而不是又制造一堆新的问题,应该是切合企业真正的实际需求做出来一些好用的 工具和平台,而不是搞一些花里胡哨却最后扔在那里没人用的花架子(我自己在这方面就掉进过大坑,之前主导做的一个开源软件就是个失败案例)。 

 

总之最后给我的感觉是,会开发的不真正的懂业务逻辑,开发出来的东西没人用,会运维的开发水平又太烂,写出来的代码烂到哭。想找个真正合格的运维自动化人才真是不容易。

 

 

 

我近期一共只面了10多个,确实不能代表全行业水平,有些真正技术牛人估计我也没有碰到,但是10多 个样本里面一个合适的都找不到,我觉得这也能差不多从侧面说明一个行业的整体平均水平了,这些求职者水平不高,却又想要高工资,我能说这是眼高手低、好高 骛远的表现么?打铁还需自身用,如果真想要高工资,请先踏实点把自身技术水平提高,如果真想做架构师,那请把架构技术和思想学好,如果真要做自动化运维, 请先把至少一门开发语言学好、学透,不只是会写个脚本就完了,脚本只是脚本,那不是自动化,So,哥们别再逗了!

 

希望此文能给业内小伙伴选择职业路径时提供帮助!

 

P.S: 我也不是什么大牛,只不过做好几年运维,做了几年自动化开发,大多数运维人员走过的路我都走过,上面写的这几案例在我自己求职时也发生过,我也是一个从月 薪2500一路走过来的屌丝而已,我写这篇文章只是为了表达对这个行业的低质、粗糙、落后的现状吐槽一下,我也是这个行业里的一员,所以所有的问题也有我 的一份, SO评论里骂我装逼的人我就不解释了,我这人就这风格,我写的其它文章比这篇可激进多了,So如果某些看官不喜欢,那就let it be 吧。 

 

 

 

补充:其实我上面面的这几个人,我都是可以把他 们留下的,只是没有办法给他们期待的工资而已,论运维水平,A君要18K,但我觉得他不值这些呀,我最多只能给到15K以下,因为如果我校招一个211学 校计算机毕业的研究生也就给11-13就可以了,再培养一年的话,相信运维+开发水平都会比A君强很多!B君也是,一个连开发模式和标准都没搞明白的半调 子程序员我能给他10K+就不错了,我现在手下的一个刚本科毕业的学生写出来的东西都比他强,有人说我对求职者要求太高,没有人什么都精通,我当然不要他 什么都精通了呀,但是在我看来是一些基础性的、通用性的知识,如果你都不了解的话,在我看来只能算做不合格,不能说我要求高。 

 

 

 

 

下面附上我认为一些很好的问题,我回答了下:

---------------------------------------

问: 我的问题不涉及技术原理,就是要问下运维工程师的工资怎么定的,一个熟练使用工具或者说自己写的脚本的人,起码是对运维这块有过多年经验的人,为什么不值 18k,这类人的定位完全可以定位于一个可以干活的人,试问一个可以干活的人,怎么就不能值18k。如果招人都执着于原理,能干出活的人少,执着于原理何 用,我绝对不是说懂原理的人不会干活。that's all

回复 花花工资hgz:

我 很想认真的回答下这个问题,但一会我又要去面试一个人,所以只能简要回答了,我做过5年运维,2年开发到现在,你说的,在我看来,这个要18K的人就跟我 最后2年做运维的时候情形是一样的,就是感觉自己什么都懂了,其实是什么都大概懂了,就像一个汽车修理工一样,干了好多年了,感觉什么车都会修了,车子出 了问题很快就能修好。但是如果这个厂商把车造出来时就有技术缺陷的话,这个他是不会去关注的。因为他只会修车,再深入的比如说发动机的详细原理他是不知道 并不关注的,他只能靠听声音来确定是不是发动机出了问题。 我觉得现在好多工作了多年的运维人员就是这种情况,工作多年也只是变成了熟练的修车工人,而自动化则是尝试改变修车行业的事情,熟练的修车工人不去多关注 的话,那我是不看好他接下来的发展前景的,但一旦说到自动化,他如果只是自己闭门造车的话,可能造出来的又只是一个三蹦子,那怎么办呢?  在我看来,如果做运维时间久了,迷茫了,就应该想想如何提高自动化水平,多跟开发人员多学学开发模式,不要只满足于只是把各种开源软件和脚本拼凑起来就 完了,做运维的如果只止步于运维,不去多想想如果做点创造性的东西的话,那你也就只能是一个运维。

--------------------------

问:是不是有些太矫情,运维最最重要的就是解决各种问题,原理,呵呵...

答: 我看到很多类似的评论,觉得运维最重要的是能干活,能解决各种问题,那我们来讨论下什么叫能干活?什么叫能解决各种问题? 把把各种服务配置好、业务运行稳定不出问题算不算能干活?当然算!但是你是花了多少的成本和代价让业务运行稳定了?这个问题你自己有没有衡量过? 我买一堆F5,一堆豪华服务器让厂商把东西都给我配置好,出了稳定找厂商帮解决,这算不算能干活?一个优秀的运维人员能把负责的整个业务以最小的代价和成 本管理的井井有条并努力尝试整个公司的IT管理环境,一个普通的运维会认为他也做到了这一点,但是是否真的做到了呢?谁知道呢?毕竟他自己相信了。

再 说能解决各种问题,什么叫能解决各种问题?我相信大多数的运维人员所谓的解决问题就是处理各种故障,但不怎么涉及优化,尤其是业务级的、代码级的优化,运 维通常只关注CPU、内存、负载是否过高,但业务非常慢怎么办?加CDN?加负载?加完后如果还是慢怎么办?如果确实是因为代码写的不好导致慢怎么办?想 过没有?当然你可以说这他妈哪是运维的问题,这是开发写的代码烂导致的问题, 但是如果你能告诉开发是他的哪块代码的调用可能导致了业务变慢的话,是否能更凸显你的价值呢?当然如果只去解决一些常规问题也无可厚非呀,但那就不要老想 着拿太高的工资了吧!

附赠在群里看网友讨论看到的一段不错的话:

 ----北京-菜菜左 2014/12/17 12:12:07
建 议搞运维的还是要把计算机体系的基础知识打牢,万丈高楼平地起,基础很重要。看似没用只是因为你没学,所以你不知道学了是啥样。别人都说不重要只是因为大 家都说不重要,也反映了运维行业的浮躁。不跟风不盲从,不迷信权威不吹水忽悠,走自己的路,不忘初心。这些话可能反对的人很多,就当我吹水吧。 

 

------------------------

问:文人相轻,做技术的也难免落入这个俗套,总是提一些别人回答不出的问题来显示自己的牛逼,忘了自己当初是个啥熊样,一个人的技术水平就凭你简单的问问就能做出答案,我服了你。

答:你自己想想,我问的那些问题是非常规问题么?这是基础问题,任何一个正经干过几年运维或运维开发都需要知道的问题!他答不上来不是我为难他,是他本身技术功底不扎实,一个人的技术水平不能通过面试面出来的话?那还要面试干个蛋用?

 

-------------------------------

问:你怎么就只看到人家缺点 ,就没有看到人家优点。你做的那软件也那么渣渣 ,你都好意思拿出来讲。做为面试者 你只见不得人家比你优秀。面了这么多人 不想想是否自己是否有问题!

答: 这个看官提到我做的软件是个渣渣,这个我承认呀,我就是做过一个失败的开源软件呀,我在博文里也说了呀,所以我才吸取了教训以后不能只做表面功夫呀,但是 我面试的这些人多跟我之前一样呀,拼拼凑凑搞个花架子出来了就叫做自动化,看着好看但解决不了什么实际问题。写个脚本就说自己提高了企业生产力。我为什么 要招这样的人?你可能觉得没有一个人一开始就很牛B,需要培养,我觉得没问题呀,可以培养呀,但既然是让我培养你,就请你不要想着即拿比你实际能力高很多 的工资,又不想让我揭穿你了吧。

 

 

---------------------------------

问:作为招聘者,你并没有从一个管理者的角度出发,认为自己只是一个干活的,不是管理者。而且你面试了十几个,竟是没发现一个合适的。好好想想是不是自己的问题?

答:我跟你保证,我没问题!面试十几个都没有合适的就代表我有问题了?为什么不能是从业人员普遍水平不高呢?你这简直就是千夫所指,无疾而终的调调!

 

------------------------

问:其 实楼主写这篇文章说白了还是装13用的,自己都搞不清楚什么是自动化,真正的自动化是什么含义,什么样的环境适合什么样的技术,张口就自动化,上万台机 器,显得很牛B似的,说白了,哄哄那些刚毕业的小弟还能凑乎,懂行的人一看这就是在给自己吹吹牛B而已。技术是在环境和场景下出来的,一个公司什么样的规 模基本决定了什么样的技术实力,不是每天喊喊口号你就能涨起来的,之前也看过楼主的开源软件,号称自动化工具,说白了也就是个脚本集成工具而已,再加点页 面展示,这有何难,你的就叫自动化了?别人的就不是了? 只能说太你吗自恋了

答:你这种评论我平时都懒的回,今天心情大好,回一下!

=====================================================

运维新手们,别再问需不需要学PYTHON了!!!
2014-07-08 
 
http://3060674.blog.51cto.com/3050674/1435907 

经常有人在群里问,运维人员需不需要学开发?需不需要学PYTHON?PYTHON和SHELL有什么区别?天天问这种好水的问题,我实在受不了,决定帮大家扫扫盲,求求新手们,以后别他妈瞎问了。

 

 

 

 

现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能,不会开发,你就不能充分理解你们系统的业务流程,你就不能帮助调试、优化开发人开发的程序,开发人员有的时候很少关注性能的问题,这些问题就得运维人员来做,一个业务上线了,导致CPU使用过高,内存占用过大,如果你不会开发,你可能只能查到进程级别,也就是哪个进程占用这么多,然后呢?然后就交给开发人员处理了,这样咋体现你的价值?

 

另外,大一点的公司,服务器都上几百,上千,甚至数万台,这种情况下怎样做自动化运维?用SHELL写脚本FOR循环?呵呵,歇了吧,SHELL也就适合简单的系统管理工作。到复杂的自动化任务还得要用专门的开发语言。你可能说了,自动化管理有专门的开源软件\监控也有,直接拿来用下就好了,但是现有的开源软件如Puppet\Saltstack\OpenStack\Zabbix\Nagios 等多 为通用的软件,不可能完全适用你公司的所有需求,当你需要做定制、做二次开发的时候,你咋办?找开发部门?开发部门不懂运维的实际业务逻辑,写出来的东西 烂烂不能用,我自己也做运维系统,6年运维工作经验,开发出来的第一版照样烂的不行,这还是懂的运维业务逻辑的,让开发人员来做,跑偏可能更多了,这就是 为什么我见过很多公司自行开发运维平台,最后都扔那了。

 

其 次,不会运维开发,你就不能自己写运维平台\复杂的运维工具,一切要借助于找一些开源软件拼拼凑凑,如果是这样,那就请不要抱怨你的工资低,你的工作不受 重视了,话说人家FaceBook一个运维工程师管2万台机器,运维工程师年薪十几万USD,你以为人家是盖的呢?哪个不是身怀绝技,开发运维兼备?

 

为什么要学PYTHON?

PYTHON第一是个非常牛B的脚本语言, 能满足绝大部分自动化运维的需求,又能做后端C/S架构,又能用WEB框架快速开发出高大上的WEB界面,只有当你自已有能力做出一套运维自动化系统的时候,你的价值才体现出来,你才有资格跟老板谈重视,否则,还是老老实实回去装机器吧。

 

运维开发为什么要用PYTHON?

Good question, 为什么不用PHP,JAVA, C++,RUBY,这里我只能说,见人见智, 如果你碰巧已经掌握了除PYTHON之外的其它语言,那你爱用啥用啥,如果你是一个连SHELL都还没写明白的新手,想学个语言的话,请用PYTHON, 为什么呢?首先,PHP是跟PYTHON比的最多的,其实他俩根本就不用比,为什么呢?两个语言适用性不同,PHP主要适用于WEB开发,可以迅速的做出中小型,轻量级的WEB网站,但后端嘛,基本还是要借助其它语言,借助什么语言呢?SHELL?PYTHON?呵呵。而PYTHON呢, 是个综合语言, 前后端都可以,单拿出来比WEB,也一点不比PHP差,但为什么WEB方向上PHP比PYTHON要火? 先入为主嘛,PHP 90年代诞生就是做WEB的,PYTHON2000年后才出现WEB框架,但论优秀程度上,PYTHON的WEB框架基本上出其无左,至少是跟PHP比。 

 

那JAVA呢?好吧,一个臃肿\中庸\豪无新意的语言,还是老老实实用它来做ERP吧,搞个运维小平台,用JAVA真心没啥必要,在我看来,JAVA就是稳定的中年男人,稳定\成熟\秃顶,而PYTOHN代表的就是青春, 简洁\快\干净\帅!

 

C++\C,这个嘛,我只能说,如果你会了PYTHON,又会C的话,那你会更吃香,但是不会C的话,其实也无大碍,基本上做运维的人,搞搞C就是为了来装B的, 因为多数情况下你都到不了看系统底层源码的程度, 不过如果你学好了PYTHON之后,还是建议你学习下C++,毕竟相比python这个动态语言来讲,C++的效率还是高很多的,但对新手来讲,不建议做 为第一门语言开始学习, 为什么呢?打击自信心。。。。呵呵,你懂的

 

RUBY,小日本开发的,还不错,风格跟PYTHON有点像,因为ruby onrails出了名,国外用的比较多,国内,放心吧,没戏,PYTHON已经把它的想象空间都占死了。

 

当然还有新的语言GO,有些搞运维的看见做开发的人员搞GO,也想凑热闹,觉得是未来,我想说,别瞎没事跟风,GO再成功,也不会变成运维开发语言。

 

 

有些人觉得PYTHON效率底,说他不能支持多线程,OH,好吧,这个还有点说对了,但是我想问,看我这篇文章的有几个做过搜索引擎开发?有几个做个上亿PV的并发网站开发? 有几个看过LINUX内核源码?如果没有,请别瞎跟着传了,知道PYTHON为什么不支持多线程吗?这句话问错了,其实PYTHON支持多线程,只是不支持多CPU多线程,也就是一个程序spawn出来的多线程只能占用一个CPU,但是为什么呢?噢,因为GIL,GIL是什么东东,请自行补脑。。。但是你非得用多线程吗?你可以用多进程呀,再牛B你还可以用协程呀,这些PYTOHN支持的都很好呀,如果你的程序逻辑不好,搞个多线程也快不起来。我认识一个博士讲过一句话,我觉得不错,他说,程序效率高低,80%都是写程序的人决定了,语言本身就占20%,所以下次有人再说PYTHON效率低的时候,请让他先回去自己检查下自己的程序多了多少无用的逻辑、循环等等。这个博士自己用PYTHON写的WEB程序,一台服务器每天能处理上亿请求,一秒并发近两万,什么WEB框架这么牛B? 别问它是谁, 它叫tornado。 

 

 

PYTHON能否自学?

当然可以,什么都可以自学,前提是你得能学得会,见过N多菜鸟踏上上自学的不归路,他妈的什么都能自学的话,还用大学干什么?自己在家鳖不就行了?动不动就说PYTHON是个脚本语言,自己看看就不会了,说这话的只可能有两种人,一种是高手,一种是SB,对于高手来讲,他肯定已经会其它语言,PYTHON在这种情况下,自学当然就很容易学会,几年前我刚接触PYTHON时,代码遇到问题,找了个开发的哥们帮调试,哥们帮调了十几分钟就搞定了,结果人家以前一句PYTHON代 码也没写过,为什么,因为语言都有相通之处,一门掌握好了,其它门自己学学就会了。但对于新手来讲,没任何语言基础就开始自学,那么恭喜你,菜鸟们见此文 章为证,从今天开始自学,一年后,你要是能自己做出个软件来,来找我要一千块钱。 哈哈,真的。 基本上自学是属于专业人员干的事情,就像会一门乐器了, 自己学下就可能学会另一门,但我之前没音乐基础,跟着老师都没把吉它学会。 

 

所以奉劝没基础又想学PYTHON的同学,花点钱去报个班学吧,拿钱换时间,时间是生命,钱没了可再挣钱,时间过去了就再也不会回来,如果你不信邪,非要自己学,那我佩服你的勇气,不过自己试试就知道了。

 

知乎上的一个问题:为什么零基础自学编程者,大多半途而废?

http://www.zhihu.com/question/21423201 

 

当 然天下没有绝对的事情,我大天朝牛X的人多了去了,很多人也能过自学编程,最后变成高手了,我的PYTHON也是自学的,但是我可以说自学过程中走过了N 多坑好么,好多时候纠结在一个简单的小问题上好几天都卡住,当时如果不是因为工作需求,估计早放弃了,这还是python,就别说其它复杂的语言了,我相 信除了少数的大牛之外,多数人不比我聪明到哪去,选择自学的同鞋们,一路珍重。

 

说了这么多,只想告诉那些迷茫不知所措该学什么语言的新手们, 在你还没学好走路的时候,不要老想着,将来我当上老板了,我是开宝马呢?还是开奔驰呢?先学会骑自行车吧。。。

 

 

最后借用国外一位python大牛说过的话, Life is short,you need Python! 人生苦短,我用Python.

=====================================================

 

网站用户访问速度监测分析项目

 

 

刚 来新公司不久做运维开发,本为以为要继续做我的开源软件开发,结果领导给分了个以前基本从来没考虑的任务,监测用户访问我们网站的速度,没错,是监测所有 的用户访问我们网站的速度。就跟基调一样。因为基调不能实现我们一些特殊的定制需求,所以公司准备我们自己开发一个。虽然以前没做过,但是有挑战才有意思 嘛,开始走起。

 

首先,确定页面速度如何监控?监控什么指标?如何分析?领导的基本需求如下:

 

  1. 实现全国各地用户访问速度的按区域分析

  2. 实现用户从浏览器开始请求到页面加载完毕的每一步骤的指标统计

  3. 实现对定点区域的任务下发

 

到底咋做?刚开始想的是,能否通过分析网站日志来实现呢?尼马,当然不可能这么简单,因为日志里最多只能记录服务器收到请求到开始响应的时间,用户何时完全加载完你的页面,是找不到的。那咋办?先学习基调的监测方法发现,他们是在全国各个机房里埋了数万个客户端,让这些客户端定时自动访问你的网站,然后再对每个客户端的加载速度做汇总后分析。很显然我们不可能在全国各个机房放一台机器当客户端,那样的花费非得把公司卖了不行。本着花小钱办大事的思想,灵光一现,为什么不让用户直接帮我们测?我们网站每天数亿PV,这么好的资源不用就白浪费了。咋让用户帮我们测?呵呵,很简单,在页面埋码,在用户访问我们页面的时候,浏览器会自动运行一段JS脚本,会纪录从浏览器开始请求到整个页面加载完毕的过程。然后我的脚本把这些纪录的值做成一个字典,统一用GET的方式发送到后台分析接口,后台分接程序接到数据进来后就按相应的分析维度做分析,然后,然后问题就解决了嘛。

GOOD,既然以为逻辑能走通,那就开始测试下吧,废话少说上干货,以下为实现过程:

 

  • 前端埋码

首先确定收集以下指标

  1. onLoad页面加载时间

  2. 页面下载时间

  3. JS加载时间

  4. 从request开始到服务器响应时间

  5. DomReady时间       

  6. 第一次渲染时间(白屏时间)

  7. DNS lookup时间     

  8. 从服务器下载第一个byte时间

  9. 导航类型  

  10. 请求的url

  11. 浏览器类型      

  12. 浏览器版本      

  13. 分辨率       

以上指标只是第一期功能,以后可能还会加很多新的指标,完全靠自己写JS来实现挺麻烦的,尼马我是运维开发呀,不是搞前端的呀,这么多东西怎么弄,果断寻找开源解决方案,找来找去找到了yahoo开源的一个页面速度指标收集的小插件boomerang, 下载下来用了下发现很强大,支持自行开发plugin, 于是就在他的基础上做了些更改,自己加入了一些自定义指标的收集。

为了帮助看客了解,先跟大家说一下,以上指标如何收集?一个HTML页面从开始服务器请求,到整个页面展现在用户面前,其实是经过好多个步骤的,擦,干说好累,还是上图吧。

wKiom1PGVZ-SaAE2AAKeyV4TnJA394.jpg

如上图,页面整个加载过程一般为:

  1. 输入网址回车 navigationStart

  2. DNS解析,获取网站IP地址  domainLookupStart

  3. 向服务器IP发起请求,TCP/IP 3次握手,建立连接 ConnectStart

  4. 服务器开始处理用户请求页面的URL     ResponseStart

  5. 向用户发送第一个字节   FristByte

  6. DOM加载完毕                  domComplete

  7. Onload事件开始               LoadEventtart

  8. 页面加载完毕                    LoadEventEnd

 

亲,知道么,现在基本上所有的主流浏览器都会在页面加载的时候把这些指标记录下来,你可以直接在JS脚本里调用。调用方法等详细指标解释请看  https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html 

 

因为不支持IE9以下的浏览器,所以,去他妈的IE,果断放弃老版本IE,直接设置为在IE9以下不执行,简单粗暴。

浏览器版本检测代码

   

 

       function get_browser() {

           var N = navigator.appName, ua =navigator.userAgent, tem;

           var M =ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);

           if (M && (TEM = ua.match(/version\/([\.\d]+)/i)) != null) M[2] =tem[1];

           M = M ? [M[1], M[2]] : [N, navigator.appVersion, '-?'];

           return M[0];

       }

       function get_browser_version() {

           var N = navigator.appName, ua = navigator.userAgent, tem;

           var M = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);

           if (M && (tem = ua.match(/version\/([\.\d]+)/i)) != null) M[2] =tem[1];

           M = M ? [M[1], M[2]] : [N, navigator.appVersion, '-?'];

           return M[1];

       }

       var browser = get_browser();

       var browser_version = get_browser_version();

       var br_detect = 0; //default to run

       if (browser == 'MSIE') {

           if (parseInt(browser_version) < 9) {

                var br_detect = 1; //not runthe status js

           }

        } //end if browser

 

                   //setJS controller variable for speed monitor plugin

                   varBoomRunMark = 0; //0 = enable ,  1=disable

                   varBoomKickStartMark = 5; // run the collect plugin when random num < 5

                   varRandomNumber = Math.floor((Math.random() * 10) + 1);

                   if(br_detect == 0) {

                            imgLoadBeginTime= new Date();

                           

                   }

                   //console.log('randomnumber :'+ RandomNumber);

       if (br_detect == 0) {

                     if (BoomRunMark == 0){

                            if(RandomNumber  < BoomKickStartMark ){

                                     BOOMR.init({

                                               beacon_url:"http://perf.che168.com/pv_perf.php",

                                               BW:{ enabled: false },

                                               RT:{

                                                        cookie:'CHE168-RT'

                                               }

                                     });

                            }//endRandomNumber check

                     }// end BoomRunMark check

       }//end if br_detect

        

 

 

 

做完后,上线测试,打开网站,就看到我的脚本在华丽丽的跑了。

 

 wKioL1PGVsbDM1BKAAHBVN8C_Cg217.jpg

由于每天收集量在大约上千万,然后又需要用户访问速度进行实时分析,所以才用了storm实时日志流分析,对数据做基本处理后,把各个地区的访问统计一下,写入redis,因为量大,实时数据只存1天左右,过了一天,就把这些数据按小时进行平均优化等。

 

 

分析方法,

由于数据量大,如果直接简单的对数据做平均的话,肯定会出现很多极值,导致平均值不能代表整组数据的实际平均值,例如,两组数,[1,999], [499,501] 两组数平均后都等于500,直接取平均值就太坑了,这时候高中数学终于用上了,直接取标准差,中位数,然后又TP90,TP99了一下,一番下来,数据基本准了,当然其中很多细节实现,有兴趣的同学可以专门找我探讨。

 

直接看最后实现吧:

 

wKiom1PGVwOhSvCgAAEEqB5AZSk378.jpgwKiom1PGVwLhGRHdAAcI0rQ6nus239.jpg

wKioL1PGWBrCQQuHAAMoiGR8Jko273.jpg

wKiom1PGVwKwkvVJAAZ-EKsdg3U766.jpg

wKioL1PGWBrR63GwAAUlMUyuxAg107.jpg

 

 

 

以下为实时监控部分:

wKioL1PGWLiw-_ErAAQEIhqUh5Q426.jpg

wKiom1PGV6HgrhivAAS9WkPD_Xk063.jpg

 

wKioL1PNzpbwoNA7AAjezfCFQDs053.jpg

wKiom1PNzXyDHj0GAAVO1wD3m90876.jpg

 

好吧,差就多就这些吧,回头搞一下,争取开源下。 打完收工。 

 

 

=====================================================

=====================================================

=====================================================

=====================================================

=====================================================

=====================================================

=====================================================

=====================================================

 

posted @ 2015-12-11 01:28  李永三  阅读(490)  评论(0编辑  收藏  举报