最近接手的 Apache HUE 項目性能出現了問題,線上經常出現響應時間過長或因為時間過長而無法服務等問題.老大讓我準備弄個性能分析工具,便於追蹤和分析平臺當前的瓶頸出現在哪裡. 那就搞起吧!先從代碼性能分析入手.本篇博客分享的也是代碼層面的性能分析. 之前用過的就有 插件. 這款插件主要可以用來 ...
最近接手的 Apache HUE 項目性能出現了問題,線上經常出現響應時間過長或因為時間過長而無法服務等問題.老大讓我準備弄個性能分析工具,便於追蹤和分析平臺當前的瓶頸出現在哪裡.
那就搞起吧!先從代碼性能分析入手.本篇博客分享的也是代碼層面的性能分析.
之前用過的就有 debug_toolbar
插件. 這款插件主要可以用來DB查詢語句及耗時時間,具體的文檔詳見:
Django Debug Toolbar
其有詳細的安裝配置教程.筆者使用的 HUE 是 基於 Django 1.6 的, 用最新版本的 toolbar 出現了相容性問題.沒辦法,既然用不起來,就找個可以使用的版本吧.這裡使用的是 django-debug-toolbar==1.3.2
, 其依賴的一個庫是sqlparse==0.1.9
.
安裝完成後,我們需要在 Odeon 中做下集成.
- 在 INSTALLED_APPS 中添加 debug_toolbar APP:
INSTALLED_APPS = (
# ...
'django.contrib.staticfiles',
# ...
'debug_toolbar',
)
- 在 MIDDLEWARE_CLASSES 中添加 debug_toolbar 中間件:
MIDDLEWARE_CLASSES = (
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ...
)
- 在 urls.py 中添加 debug_toolbar 的 URLs:
from django.conf import settings
from django.conf.urls import include, patterns, url
if settings.DEBUG:
import debug_toolbar
urlpatterns += patterns('',
url(r'^__debug__/', include(debug_toolbar.urls)),
)
說明: Odeon 的 url位置是 desktop/core/src/desktop/urls.py
- 配置 Internal IPs:
Debug Toolbar 僅僅會在你指定的 IP 中展示,而我們指定需要展示的 IP可以在 INTERNAL_IPS 參數中配置。我這裡的配置如下:
INTERNAL_IPS = [
'127.0.0.1',
'192.168.5.20'
]
如果不指定, 其預設是 127.0.0.1
配置好之後,就可以使用了.
這款插件還可以分析記憶體使用情況.具體自己 Google 就可以啦.
接下來,我們需要去分析 Django 中哪塊比較耗時.怎麼辦呢? 在 Python 官網上面,看到了 cProfile:
Python cProifle 文檔
其可以展示出本次執行每個模塊耗時時間,還可以支持排序, 返回數據條數等參數.感覺厲害,那就用起來. 在使用前,為了避免重覆造輪子,看下 git 上有沒有人已經做了這麼一個中間件.果然!很多嘛!
Django Profile
Django Profile Middleware
我藉助了其中的一個,自己改改就用起來了.詳情可以見下麵的截圖:
至此,基本上算是結束了.但是,就在不經意間, 筆者發現了更好用的.哈哈!
接下來要分享的就是 KCacheGrind + django-extension 的使用.
django-extensions 的代碼和文檔見下:
Django extensions代碼
django-extensions 文檔
我使用的是其中的 profile 模塊:
django-extensions profiler
通過生成 prof
文件後,我們可以藉助 KCacheGrind
來查看具體的圖形化信息,很直觀的可以展示出調用和耗時信息.KCacheGrind
的安裝在這裡就不啰嗦了.直接上運行結果圖:
看起來感覺更直觀了.但是,KCacheGrind 雖然功能強大,但其輸出的分析樹貌似並不完整.不過夠用了.
<
runsnakerun
感覺跟 KCacheGrind 類似.line_profile
分析到某個模塊之後,可以利用此工具來更具體的分析.memory_profiler
Python 記憶體監控工具. Django 中可以在debug_toolbar 裡面配置.heapy 記憶體分析的工具.記憶體分析這塊,可以看這篇博客: http://www.jianshu.com/p/2d06a1a01cc3
dowser
dis
最後,推薦一個我一個哥們寫的,感覺不錯: https://github.com/weidwonder/OwnPyProfiler