第章 服務器性能剖析
在我們的技術咨詢生涯中最常碰到的三個性能相關的服務請求是如何確認服務器是否達到了性能最佳的狀態找出某條語句為什麼執行不夠快以及診斷被用戶描述成停頓堆積或者卡死的某些間歇性疑難故障本章將主要針對這三個問題做出解答我們將提供一些工具和技巧來優化整機的性能優化單條語句的執行速度以及診斷或者解決那些很難觀察到的問題(這些問題用戶往往很難知道其根源有時候甚至都很難察覺到它的存在)
這看起來是個艱巨的任務但是事實證明有一個簡單的方法能夠從噪聲中發現苗頭這個方法就是專注於測量服務器的時間花費在哪裡使用的技術則是性能剖析(profiling)在本章我們將展示如何測量系統並生成剖析報告以及如何分析系統的整個堆棧(stack)包括從應用程序到數據庫服務器到單個查詢
首先我們要保持空杯精神拋棄掉一些關於性能的常見的誤解這有一定的難度下面我們一起通過一些例子來說明問題在哪裡
性能優化簡介
問 個人關於性能的問題可能會得到 個不同的回答比如每秒查詢次數CPU利用率可擴展性之類這其實也沒有問題每個人在不同場景下對性能有不同的理解但本章將給性能一個正式的定義我們將性能定義為完成某件任務所需要的時間度量換句話說性能即響應時間這是一個非常重要的原則我們通過任務和時間而不是資源來測量性能數據庫服務器的目的是執行SQL 語句所以它關注的任務是查詢或者語句如SELECTUPDATEDELETE 等注數據庫服務器的性能用查詢的響應時間來度量單位是每個查詢花費的時間
還有另外一個問題什麼是優化?我們暫時不討論這個問題而是假設性能優化就是在一定的工作負載下盡可能地降低響應時間
很多人對此很迷茫假如你認為性能優化是降低CPU 利用率那麼可以減少對資源的使用但這是一個陷阱資源是用來消耗並用來工作的所以有時候消耗更多的資源能夠加快查詢速度很多時候將使用老版本InnoDB 引擎的MySQL 升級到新版本後CPU利用率會上升得很厲害這並不代表性能出現了問題反而說明新版本的InnoDB 對資源的利用率上升了查詢的響應時間則更能體現升級後的性能是不是變得更好版本升級有時候會帶來一些bug比如不能利用某些索引從而導致CPU 利用率上升CPU 利用率只是一種現象而不是很好的可度量的目標
同樣如果把性能優化僅僅看成是提升每秒查詢量這其實只是吞吐量優化吞吐量的提升可以看作是性能優化的副產品對查詢的優化可以讓服務器每秒執行更多的查詢因為每條查詢執行的時間更短了(吞吐量的定義是單位時間內的查詢數量這正好是我們對性能的定義的倒數)
所以如果目標是降低響應時間那麼就需要理解為什麼服務器執行查詢需要這麼多時間然後去減少或者消除那些對獲得查詢結果來說不必要的工作也就是說先要搞清楚時間花在哪裡這就引申出優化的第二個原則無法測量就無法有效地優化所以第一步應該測量時間花在什麼地方
我們觀察到很多人在優化時都將精力放在修改一些東西上卻很少去進行精確的測量我們的做法完全相反將花費非常多甚至% 的時間來測量響應時間花在哪裡如果通過測量沒有找到答案那要麼是測量的方式錯了要麼是測量得不夠完整如果測量了系統中完整而且正確的數據性能問題一般都能暴露出來對症下藥的解決方案也就比較明了測量是一項很有挑戰性的工作並且分析結果也同樣有挑戰性測出時間花在哪裡和知道為什麼花在那裡是兩碼事
前面提到需要合適的測量范圍這是什麼意思呢?合適的測量范圍是說只測量需要優化的活動有兩種比較常見的情況會導致不合適的測量
在錯誤的時間啟動和停止測量
測量的是聚合後的信息而不是目標活動本身
例如一個常見的錯誤是先查看慢查詢然後又去排查整個服務器的情況來判斷問題在哪裡如果確認有慢查詢那麼就應該測量慢查詢而不是測量整個服務器測量的應該是從慢查詢的開始到結束的時間而不是查詢之前或查詢之後的時間
完成一項任務所需要的時間可以分成兩部分執行時間和等待時間如果要優化任務的執行時間最好的辦法是通過測量定位不同的子任務花費的時間然後優化去掉一些子任務降低子任務的執行頻率或者提升子任務的效率而優化任務的等待時間則相對要復雜一些因為等待有可能是由其他系統間接影響導致任務之間也可能由於爭用磁盤或者CPU 資源而相互影響根據時間是花在執行還是等待上的不同診斷也需要不同的工具和技術
剛才說到需要定位和優化子任務但只是一筆帶過一些運行不頻繁或者很短的子任務對整體響應時間的影響很小通常可以忽略不計那麼如何確認哪些子任務是優化的目標呢?這個時候性能剖析就可以派上用場了
如何判斷測量是正確的?
如果測量是如此重要那麼測量錯了會有什麼後果?實際上測量經常都是錯誤的對數量的測量並不等於數量本身測量的錯誤可能很小跟實際情況區別不大但錯的終歸是錯的所以這個問題其實應該是測量到底有多麼不准確?這個問題在其他一些書中有詳細的討論但不是本書的主題但是要意識到使用的是測量數據而不是其所代表的實際數據通常來說測量的結果也可能有多種模糊的表現這可能導致推斷出錯誤的結論
返回目錄高性能MySQL
編輯推薦
ASP NET開發培訓視頻教程
數據倉庫與數據挖掘培訓視頻教程
Oracle索引技術
From:http://tw.wingwit.com/Article/program/MySQL/201311/29721.html