python效能調優的一次記錄

發表於2016-02-01

最近在grahite上看到響應時間變得很長,雖說之前沒有特意去優化效能,但是感覺也不應該這麼差才對。

QQ20150406 1

我們的伺服器框架用的就是我之前開源的 maple,每個命令字都對應一個入口函式,如下:

 

所以只要找到一種方法分析這個函式對應的內部呼叫情況就可以了。

很方便的,python內建了cProfile類來完成我們想要的功能,我給封裝成為一個裝飾器,用起來更方便一些,當然在django和flask中也可以直接用。

 

執行到對應的函式後,就會將統計寫到函式名對應的stat檔案中,比如 login.stat。

相應的,我也封裝了一個分析工具:

 

用起來非常簡單,執行一下:

 

輸出結果如下:

 

可以明顯看到時間消耗在 time.sleep 上。

好了,上面只是一個簡單的示例,接下來看今天解決的問題的真實情況。

下面兩張圖分別是牌桌內有2人和7人的情況下的呼叫圖。

2人:

QQ20150406 3

7人:

QQ20150406 2

 

異常的部分均使用顏色加亮了,可以看出幾個端倪:

  1. 隨著人數變多,有些部分的請求翻了幾倍
  2. 讀取資料庫和redis的呼叫量太大

既然知道了是與儲存通訊的問題,那麼接下來就來看看是哪些地方呼叫了 get_db_user,get_user_from_db。

cProfile 提供了一個方法:

 

所以通過這種方法拿到:

4EF1E801 22DE 45B1 BC10 9CF9154FB56B

CBF7C01C C2D2 4164 A5C7 673B38B11EB4

 

所以接下來就去看下上面的程式碼中這些資料庫呼叫是否是必要就可以了。

基本就是這樣了。

另外之前也出現過python記憶體洩漏的定位,可惜沒有寫下來文件,只記得是用 objgraph,不過用起來也比較簡單,等下次遇到再說吧。

相關文章