很久没写文章了,最近要来刷下存在感,近两 年,运维自动化被炒的火的不行,行业趋势不可挡,如今企业招运维工程师都要求会一门开发语言。咱们公司也不例外,因为刚上市,一会儿有钱了,开始招兵买马 瞎折腾,所以最近我也面试了不下十来个求职者,本成想能够很容易招到几个不错的小伙,结果却令我很失望,今天贴几个面试者例子上来,跟你们吐槽下:php
面试A君:html
应聘职位:高级系统工程师 , 工资要18K前端
此君简历写的不错,在360干过几年,简历上写的是维护公司的360网盘平台,管理着2000多台机器,写了不少自动化工具。而后我就让他跟我聊聊他作的自动化工具,哥们娓娓到来跟我讲他写的那些脚本(自动部署、批量命令、日志分析),从他的表情中感受他好像以为他作过的这些东西很牛B(其实都是一堆SHELL+PYTHON拼凑起来的粗糙工具,需求稍一改变就不能知足,脚本的扩展性极差),他说他如今的工做基本上80%都能经过脚本完成,说完后直视我,貌似是等待着个人承认,出于尊重,我只好说那确实不错。接下来我就拿他写过的批量并发执行命令的脚本跟他深刻聊了下,他说这个脚本是Python多线程并发的,1000台机器执行一次批量命令1分钟就能所有完成,我因而让他给我讲讲多线程与多进程的区别,在何时用线程或进程更合适,结果哥们说了不少废话也没有讲明白。而后我又让他用PYTHON多线程给我写个简单的生产者消费者模型,哥们愣是不知道这是啥东西?那我又问,若是你不知道生产者消费者模型是什么,那你的并发异步处理是怎么作的?哥们语塞说没在这方面作过深刻研究,我因而又问了几个其它方面的问题,好比他的Ngnix 日志是如何分析的?自动部署如何跟git结合的?监控报警接口是如何优化才下降误报率的?但回答的都不理想,而后,就没有而后了….。 在这里我只能说,我不是想打击他,若是你只是写了几个脚本就声称本身就是自动化大拿了,未免有点牵强。因此他被PASS掉了,由于我以为把他招过来,真的不会给咱们公司的自动化水平提升多少!python
面试B君:ios
应聘职位:运维自动化开发工程师, 工资不能低于16Kgit
此君简历上说他擅长PHP\Python开发,在原公司作过运维自动化平台。我很感兴趣,让他讲一下他作的东西,主要是监控平台和CMDB资产数据库,让他着重讲了一下他的监控架构,他说他的项目主要是主动监控方式,就是监控服务器每隔一两分钟去轮巡一次全部的机器的SNMP接口,把各机器的基本系统性能信息抓回来,再经过RRDTOOL出图。他们有500多台机器散落在3个不一样地区的机房,我问他大家这种作主动监控轮巡一次得多少时间?他说1分 钟左右,我说若是轮巡过程当中,若是有几台机器连不上怎么办?他说他的轮巡是并发的,连不上的不会影响其它机器的监控,我说可是你的线程池的线程个数是有限 的,有几个线程由于机器连不上,那就会产生阻塞直至超时,但在超时以前这几个线程是不会再空闲出来的,所以确定会致使整个轮巡时间的加长呀。哥们想了想 说,确实存在这样的问题。而后我问他有没有考虑过用被动监控方式,就是让客户端自动汇报数据呢?他说当时他们也这样想过,可是一想到要在全部的机器上装个 客户就以为会增长复杂度,而且维护和管理不容易。我说采用被动模式确实会增长点复杂度,但会给你带来不少好处呀,监控客户端自动给你的服务器汇报数据会大 大减小你主监控服务器的负载,而且可监控的东西要多的多呀,你还能够自定义插件,自动升级,而且还能够把监控客户端当作它用,好比自动化部署、任务下发 等。多是出于尊重,哥们伪装赞成了个人见解。程序员
而后我又问他们的项目是几我的开发的,他说算他在内有3我的一块作,我说那大家以前是如何协做的,好比接口互相是如何调用和约定的?他说基本上是每一个人写本身的接口,互相之间约定好如何调用。我问那大家有没有遵循什么标准?好比是统一用http api仍是其它的?接口格式是统一用Json仍是用XML 或其它?哥们说他们有的用JSON、有的用XML。我说大家没有用restful标准吗?哥们表示没听过。。。。。OH,好吧!若是你们开发时都不遵循必定的标准和规范,我真心不知道他们的系统之后如何扩展,不知道这个哥们离职后谁还能看懂他的代码?不知道这种拿一堆随心所意写出来的脚原本拼凑起来的所谓的系统能知足多少实际需求?web
面试C君:面试
应聘职位:运维工程师 工资要求11Kredis
哥们刚工做不到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?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.
=====================================================
网站用户访问速度监测分析项目
刚 来新公司不久作运维开发,本为觉得要继续作个人开源软件开发,结果领导给分了个之前基本历来没考虑的任务,监测用户访问咱们网站的速度,没错,是监测全部 的用户访问咱们网站的速度。就跟基调同样。由于基调不能实现咱们一些特殊的定制需求,因此公司准备咱们本身开发一个。虽然之前没作过,可是有挑战才有意思 嘛,开始走起。
首先,肯定页面速度如何监控?监控什么指标?如何分析?领导的基本需求以下:
实现全国各地用户访问速度的按区域分析
实现用户从浏览器开始请求到页面加载完毕的每一步骤的指标统计
实现对定点区域的任务下发
到底咋作?刚开始想的是,可否经过分析网站日志来实现呢?尼马,固然不可能这么简单,由于日志里最多只能记录服务器收到请求到开始响应的时间,用户什么时候彻底加载完你的页面,是找不到的。那咋办?先学习基调的监测方法发现,他们是在全国各个机房里埋了数万个客户端,让这些客户端定时自动访问你的网站,而后再对每一个客户端的加载速度作汇总后分析。很显然咱们不可能在全国各个机房放一台机器当客户端,那样的花费非得把公司卖了不行。本着花小钱办大事的思想,灵光一现,为何不让用户直接帮咱们测?咱们网站天天数亿PV,这么好的资源不用就白浪费了。咋让用户帮咱们测?呵呵,很简单,在页面埋码,在用户访问咱们页面的时候,浏览器会自动运行一段JS脚本,会纪录从浏览器开始请求到整个页面加载完毕的过程。而后个人脚本把这些纪录的值作成一个字典,统一用GET的方式发送到后台分析接口,后台分接程序接到数据进来后就按相应的分析维度作分析,而后,而后问题就解决了嘛。
GOOD,既然觉得逻辑能走通,那就开始测试下吧,废话少说上干货,如下为实现过程:
前端埋码
首先肯定收集如下指标
onLoad页面加载时间
页面下载时间
JS加载时间
从request开始到服务器响应时间
DomReady时间
第一次渲染时间(白屏时间)
DNS lookup时间
从服务器下载第一个byte时间
导航类型
请求的url
浏览器类型
浏览器版本
分辨率
以上指标只是第一期功能,之后可能还会加不少新的指标,彻底靠本身写JS来实现挺麻烦的,尼马我是运维开发呀,不是搞前端的呀,这么多东西怎么弄,果断寻找开源解决方案,找来找去找到了yahoo开源的一个页面速度指标收集的小插件boomerang, 下载下来用了下发现很强大,支持自行开发plugin, 因而就在他的基础上作了些更改,本身加入了一些自定义指标的收集。
为了帮助看客了解,先跟你们说一下,以上指标如何收集?一个HTML页面从开始服务器请求,到整个页面展示在用户面前,实际上是通过好多个步骤的,擦,干说好累,仍是上图吧。
如上图,页面整个加载过程通常为:
输入网址回车 navigationStart
DNS解析,获取网站IP地址 domainLookupStart
向服务器IP发起请求,TCP/IP 3次握手,创建链接 ConnectStart
服务器开始处理用户请求页面的URL ResponseStart
向用户发送第一个字节 FristByte
DOM加载完毕 domComplete
Onload事件开始 LoadEventtart
页面加载完毕 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
作完后,上线测试,打开网站,就看到个人脚本在华丽丽的跑了。
因为天天收集量在大约上千万,而后又须要用户访问速度进行实时分析,因此才用了storm实时日志流分析,对数据作基本处理后,把各个地区的访问统计一下,写入redis,由于量大,实时数据只存1天左右,过了一天,就把这些数据按小时进行平均优化等。
分析方法,
因为数据量大,若是直接简单的对数据作平均的话,确定会出现不少极值,致使平均值不能表明整组数据的实际平均值,例如,两组数,[1,999], [499,501] 两组数平均后都等于500,直接取平均值就太坑了,这时候高中数学终于用上了,直接取标准差,中位数,而后又TP90,TP99了一下,一番下来,数据基本准了,固然其中不少细节实现,有兴趣的同窗能够专门找我探讨。
直接看最后实现吧:
如下为实时监控部分:
好吧,差就多就这些吧,回头搞一下,争取开源下。 打完收工。
=====================================================
=====================================================
=====================================================
=====================================================
=====================================================
=====================================================
=====================================================
=====================================================