做些鋪墊
當今嵌入式設備OS系統優化面臨的挑戰難題有:
造成發熱,卡頓,待機時間差的主要瓶頸是什麼?
當設置內核,JVM,資源管理功能的參數時,到底該怎麼設置才合理?
如何全面的評估某個算法的優化效果?
想要回答上面幾個問題,目前的做法是根據幾個有效日誌或者通過本地復現的手段來尋找線索。雖然可以回答問題,也有理有據,但他的準確度是值得懷疑的。最根本的原因是樣本量太少!
以問題3爲例,假設是在評估某個CPU Affinity分配算法。可以通過單個或多個的benchmark結果來評估算法效果,但還是有可能發生“不知道的不知道”。
爲了避免發生“不知道的不知道”,我們可以採用如下方法:
構建實驗組與對照組,通過對比實驗的方式量化優化效果。評估單維度指標,也可以同時評估多個維度的指標變化。
量化不同算法下的系統主要瓶頸變化,用於排除優化一個場景反而帶來另一個場景的性能降低。
爲了實現方法1,2,我們應該具備如下能力:
低負載的多維度數據監控與存儲器。
大數據分析能力。
全棧業務領域知識。
數據科學
那我們怎麼才能系統化的建設這方面能力呢?下面引申出本文章的主題,數據科學。
❝Data science is a multi-disciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from structured and unstructured data. - 維基百科
❞
這裏的關鍵詞是 scientific method,extract knowledge and insights。使用科學的方法,從數據中獲得洞見。隨着大數據技術的完善與普及,通過利用大量採集而來的數據來認識事物本質成爲了可能。而我們習慣的思考模式是從個別現象中尋找共性,然後再用大量事實來驗證此共性是否準確。第二種方法進展緩慢,且成本也大。但第一種就不一樣了,隨着數據的存儲跟計算越來越便宜,我們可以直接使用數據獲得有用的洞見。
若想成功應用數據科學,需要兼備如下多學科知識跟技能:
概率與統計學
機器學習
業務領域知識
計算機科學
代碼編程
數據可視化
表達與溝通
應用數據科學的步驟
針對系統優化領域,我們應該怎麼使用數據科學方法獲得洞見呢?我認爲以下6個步驟是必須的,而且嚴格按照順序執行:
定義分析目的
定義有效的評估指標
數據收集器的設計與實現
根據分析目的,選擇對應的分析模型來分析數據
尋找洞見
根據洞見反推設計,並得到改善
[步驟1] 定義分析目的
分析目的不同設計的指標與分析方法也不同,常見的分析目的有:
趨勢觀察
A/B Test
異常時問題分析
瓶頸分析
異常預警
[步驟2] 定義有效的評估指標
這步驟主要考驗領域知識的掌握深度,因爲指標的主要來源以及服務目標就是來自於業務。指標定義要優先於優化方案評估,目的在於你的優化方案要爲指標的優化而努力。這時候指標更像是一種優化目標的量化方法,如果優化目標無法量化也意味着你的不明白你到底要做什麼。好指標應當結合業務需求,技術需求的不同角度來綜合設計。比如谷歌的WSMeter指標,阿里數據中心的WorkDone指標。通過思考指標的定義,也促使自己思考優化的方向。一個好的指標,像個燈塔一樣,非常準確地指引着優化目標,而一個壞的指標往往會導致顧此失彼的結果。
提到指標,就不得不提到北極星指標(North Start Metric),又被稱爲唯一重要的指標。它是用戶增長領域裏的概念,意指像北極星一樣高高閃耀在天空中,指引着全公司上上下下向着同一個方向努力。雖然關注領域有點不同,但是所要達成的目標是一致的,即能夠準確量化最關鍵的業務目標。讀者可以感受下制定北極星指標時需要遵守的幾個標準:
「標準1」:你的產品的核心價值是什麼?這個指標可以讓你知道你的用戶體驗實現了這種價值嗎?
「標準2」:這個指標能夠反映用戶的活躍程度嗎?
「標準3」:如果這個指標變好了,是不是能說明你的整個公司是在向好的方向發展?
「標準4」:這個標準是不是很容易被你的整個團隊理解和交流呢?
「標準5」:這個指標是一個先導指標,還是一個滯後指標?
「標準6」:這個指標是不是一個可操作的指標?
[步驟3] 數據收集器的設計與實現
收集器需要參考指標的定義來設計,有些數據的採集難度或者成本較高,這時候可以通過巧妙的指標來彌補這部分缺點。有時候因爲現有機制缺少相關的數據提供方式,需要單獨實現一套高效率的收集機制,特別是牽涉到內核級別的數據時往往都會採用定製方法。
綜合來說主要原則有三個:
數據能夠準確的代表業務,這是基礎中的基礎。
收集數據時工作負載要小,需要控制在一定影響範圍內。如果無法保證性能的話需要採用發佈策略在儘可能不打擾用戶的前提下抓取數據。
數據能完整地涵蓋業務變化,寧可多收集一些冗餘數據但不能容忍有遺漏。
[步驟4] 根據分析目的,選擇對應的分析模型來分析數據
爲了達成有效的數據實驗,需要熟悉各種數據挖掘技術(算法),除了工作原理之外還有就是他們的最佳應用場景。根據分析目的爲分類的話:
分析目的爲趨勢觀察時:
只需要將收集上來的數據進行ETL之後使用可視化工具展示就可以了,這裏的難點在於可視化圖表的選擇上,選擇原則爲:
儘量使讀者看圖知意,不需要過多的猜測與思考以免造成誤解。
可視化圖表需要展示完整的數據。
分析目的爲異常分析時:
基本以非結構化數據爲主,分析主要結合領域知識跟專家系統做分析平臺。經常會被產品化團隊當做主要分析目的使用。
分析目的爲瓶頸分析與異常預警時:
基本以結構化日誌爲主,使用的算法主要來自機器學習領域。
常見的數據挖掘技術有:
決策樹(Decision Tree)
神經網絡(Neural Network)
迴歸(Regression)
關聯規則(Association Rule)
聚類(Clustering)
貝葉斯分類方法(Bayesian Classifier)
支持向量機(Support Vector Machine)
主成分分析(Principal Components Analysis)
假設檢驗(Hypothesis Test)
[步驟5] 尋找洞見
這一步重點在於使用業務知識來解讀步驟4中生成的數據結論。從經驗上來看,往往決定勝負的並不是數據挖掘技術,而是來自於對業務的深刻理解上。這時候數據結果起到輔助判斷的作用,所以萬不可盲目崇拜數據技術而不重視業務知識。特別需要注意的是當業務專家與算法計算結果發生衝突的時候,這可能是一個潛在的優化點。
[步驟6] 根據洞見反推設計,並得到改善
前面的努力都是爲了這一刻,從步驟5中獲得的洞見將會指導我們重新審視現有的方案,或者驗證我們的猜想。這一步是我們的終極目的,只有反哺到了現有業務,纔是真正有效的一次數據應用實踐。但這並不意味着結束,通過此步驟得到結果,我們可以發起下一輪的實驗,即返回到了步驟1。
寫在最後
人的認知提升是一個螺旋上升的過程,不要指望一把命中目標,我們應該具備的思維方式是迭代式改進的思維模式(或者說是演化思維)。在後果可控的前提下可以犯錯,可以做實驗,這一次實驗是要站在前一次實驗的基礎上。通過這種方法不敢保證一定會成功,但它是成功概率最高的一種做事方法。
理論知識往往都很好學,很好理解,難點就在於時刻把理論應用到現實中,從現實中驗證理論。有點像學習經濟學思維一樣,他並不要求你能背誦多少個經濟學名詞,反而更關心經濟學規律如何在現實中得到應驗,以及如何使用規律構建規則使社會運行效率最大化。
經濟學原理指出,當交易成本近乎爲零時,誰更能利用好資源,那資源就歸誰。同樣道理,數據本身只是存儲在服務器裏,誰能挖掘到洞察,誰就得到金子。
Reference
張溪夢:首席增長官:如何用數據驅動增長
盧輝:數據挖掘與數據化運營實戰:思路,方法,技巧與應用