心靈雞湯151211

 

哥們別逗 了,寫個腳本那真不叫運維自動化!

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

很久沒寫文章了,最近要來刷下存在感,近兩 年,運維自動化被炒的火的不行,行業趨勢不可擋,如今企業招運維工程師都要求會一門開發語言。咱們公司也不例外,因爲剛上市,一會兒有錢了,開始招兵買馬 瞎折騰,所以最近我也面試了不下十來個求職者,本成想能夠很容易招到幾個不錯的小夥,結果卻令我很失望,今天貼幾個面試者例子上來,跟你們吐槽下: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了!!!
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

 

好吧,差就多就這些吧,回頭搞一下,爭取開源下。 打完收工。 

 

 

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

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

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

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

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

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

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

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

相關文章
相關標籤/搜索