前方高能!如何保障Python應用的高性能
Python作為一種推崇“簡單、優(yōu)雅、明確”的面向對象語言,以其簡捷明了的語法結構,豐富的類庫,出色的易用性在互聯(lián)網(wǎng)時代得到了廣泛的應用。不論是國外的Facebook、Youtube、Instagram、Pinterest,還是國內(nèi)的知乎、豆瓣,用Python開發(fā)的Web應用已經(jīng)無處不在。

而隨著云計算時代的到來,以及基于Python的云架構開源項目OpenStack的流行,越來越多的企業(yè)開始引入云服務的概念,嘗試利用云計算服務來構建新的高可用架構。而同樣地,企業(yè)級應用程序的設計與開發(fā)方式也發(fā)生了轉變——開發(fā)人員需要構建原生的云計算應用,以便更有效的降低運營成本并提升靈活性。利用云平臺與云服務再結合Python來進行應用開發(fā),就成為了一種行之有效的途徑。
Python確實是個好語言,簡單易用上手快,標準庫和PyPI第三方庫有豐富而又有用的資源,可以快速的解決開發(fā)者的問題,而不用重復造輪子,這些特點使得Python這幾年逐漸流行起來。相對而言,C受限于較為低級的語法,開發(fā)周期長,一般用來開發(fā)性能要求高的軟件。Java偏重于企業(yè)開發(fā),緩慢的JVM啟動速度導致Java不適合用來開發(fā)系統(tǒng)管理腳本。而Python作為一個多面手,被廣泛應用于Web開發(fā)、科學計算、數(shù)據(jù)分析、云計算(OpenStack)、運維平臺和自動化運維(SaltStack)等。
Python的優(yōu)點很多,但隨著企業(yè)業(yè)務向云端和移動互聯(lián)網(wǎng)上的遷移,真實線上環(huán)境的復雜性,巨大的流量壓力,以及IT架構的高可用問題,都會造成Python應用的性能瓶頸。作為Pythoner的你是否常被這幾個問題所困擾:
1.代碼執(zhí)行速度真的很快嗎?
2.代碼性能瓶頸出在哪里?
3.內(nèi)存消耗大不大?
4.是否存在內(nèi)存泄漏?
透視寶Python監(jiān)控實現(xiàn)原理
在剛剛舉行的PyConChina 2015大會上,國內(nèi)領先的應用性能管理服務商云智慧VP劉國強 (Bruce Liu)先生,為廣大Pythoner帶來《Python 應用性能管理》主題分享,和大家一同探討云智慧透視寶是如何保障Python應用在生產(chǎn)環(huán)境下的高性能。

針對復雜的IT架構,云智慧采用Backbone分布式監(jiān)測節(jié)點監(jiān)控,實現(xiàn)系統(tǒng)統(tǒng)一調度監(jiān)控任務,所有監(jiān)控點同步執(zhí)行,依賴可靠的骨干網(wǎng)監(jiān)測點執(zhí)行監(jiān)控任務,技術上消除網(wǎng)絡抖動和噪聲帶來的干擾,穩(wěn)定可靠的數(shù)據(jù)可以用于評估SLA。

而部署在應用系統(tǒng)中的智能探針會根據(jù)應用系統(tǒng)的語言,自動安裝對應的探針程序,并為系統(tǒng)繪制應用拓撲。透視寶Python探針pythonAgent會在框架的RequestHandler添加上下文管理器(context manager),通過Smartpythonagent模塊實現(xiàn)上下文管理協(xié)議的__enter__() 和 __exit__() 方法控制tracer進程的起始和結束。Tracer進程通過python的sys.settrace()庫方法進行開啟和結束代碼的trace過程。
Output模塊會對tracer進程返回的代碼trace信息進程處理生成我們想要的數(shù)據(jù)。其中的tree是對代碼執(zhí)行過程以方法名作為節(jié)點生成樹狀的結構,能直接通過tree來還原代碼執(zhí)行時的方法調用過程。而Map則記錄tree中每個節(jié)點的執(zhí)行信息,如消耗內(nèi)存,執(zhí)行時間等。Output模塊處理完數(shù)據(jù)后會向smartAgent的sendproxy發(fā)送數(shù)據(jù),***sendproxy會向透視寶服務器發(fā)送數(shù)據(jù)。 pythonAgent的tracer進程能跟蹤到'call', 'line', 'return', 'exception', 'c_call', 'c_return', or 'c_exception'事件。

依托于各種Web輕量級應用框架,Python在Web應用上得到最廣泛支持,而透視寶的SmartAgent支持主流的Django、Tornado、CherryPy、Flask、Pylons、Bottle等應用框架,保證Python代碼性能數(shù)據(jù)抓取的準確性和高效能。配合透視寶部署在服務端的其他應用服務監(jiān)控,包括Apache、Nginx、Tomcat、Weblogic、MySQL、Memcache、Redis、Oracle、MongoDB、PostgreSQL等,開發(fā)和運維人員能夠***時間發(fā)現(xiàn)應用系統(tǒng)的潛在問題,準確定位應用執(zhí)行緩慢的真實原因。
如何利用透視寶監(jiān)控Python應用
用戶可以訪問透視寶產(chǎn)品網(wǎng)站:http://toushibao.com/ ,申請免費試用帳號,進入應用管理,下載Smart Agent并進行安裝,安裝完成訪問“系統(tǒng)→插件管理”,找到Smart Agent所安裝的主機,按以下說明來安裝、配置及開啟相關代碼插件。

1、安裝Python應用發(fā)現(xiàn)插件
根據(jù)Web容器類型安裝應用發(fā)現(xiàn)插件,該插件可自動發(fā)現(xiàn)容器內(nèi)的所有應用實例并生成應用拓撲圖。
1)如果直接使用的Python Server,可以直接跳過本步驟。
2)如果Web容器為Apache
請安裝并配置Apache類型的應用發(fā)現(xiàn)插件ApacheApp,配置完成后開啟插件。
3)如果Web容器是Nginx
請首先在插件的配置界面中選擇安裝Nginx類型的應用發(fā)現(xiàn)插件NginxApp。安裝完成之后您還需要配置Nginx插件,與Apache不同的是,此時您需要在主機上手工編譯,請參考安裝目錄中“./plugins/nginx_path/README”文檔。
2、安裝并開啟Python代碼監(jiān)控插件PythonCode
選擇PythonCode插件安裝并開啟,SmartAgent將自動下載插件至安裝目錄的smart_agent/plugins下。
默認會使用系統(tǒng)Python進行安裝。修改PythonAgent.sh中PythonCommand值,可安裝至系統(tǒng)中其他Python環(huán)境。
3、重啟Web Server
安裝開啟Python代碼監(jiān)控插件后,可能需要您手動重啟web Server(apache\httpd\Nginx\Python Server等軟件)。
4、查看Python應用數(shù)據(jù)
配置完成后,大致兩分鐘后您就可以在“應用”模塊中查看數(shù)據(jù)。























