前方高能!如何保障Python應(yīng)用的高性能
Python作為一種推崇“簡單、優(yōu)雅、明確”的面向?qū)ο笳Z言,以其簡捷明了的語法結(jié)構(gòu),豐富的類庫,出色的易用性在互聯(lián)網(wǎng)時代得到了廣泛的應(yīng)用。不論是國外的Facebook、Youtube、Instagram、Pinterest,還是國內(nèi)的知乎、豆瓣,用Python開發(fā)的Web應(yīng)用已經(jīng)無處不在。
而隨著云計算時代的到來,以及基于Python的云架構(gòu)開源項目OpenStack的流行,越來越多的企業(yè)開始引入云服務(wù)的概念,嘗試?yán)迷朴嬎惴?wù)來構(gòu)建新的高可用架構(gòu)。而同樣地,企業(yè)級應(yīng)用程序的設(shè)計與開發(fā)方式也發(fā)生了轉(zhuǎn)變——開發(fā)人員需要構(gòu)建原生的云計算應(yīng)用,以便更有效的降低運營成本并提升靈活性。利用云平臺與云服務(wù)再結(jié)合Python來進(jìn)行應(yīng)用開發(fā),就成為了一種行之有效的途徑。
Python確實是個好語言,簡單易用上手快,標(biāo)準(zhǔn)庫和PyPI第三方庫有豐富而又有用的資源,可以快速的解決開發(fā)者的問題,而不用重復(fù)造輪子,這些特點使得Python這幾年逐漸流行起來。相對而言,C受限于較為低級的語法,開發(fā)周期長,一般用來開發(fā)性能要求高的軟件。Java偏重于企業(yè)開發(fā),緩慢的JVM啟動速度導(dǎo)致Java不適合用來開發(fā)系統(tǒng)管理腳本。而Python作為一個多面手,被廣泛應(yīng)用于Web開發(fā)、科學(xué)計算、數(shù)據(jù)分析、云計算(OpenStack)、運維平臺和自動化運維(SaltStack)等。
Python的優(yōu)點很多,但隨著企業(yè)業(yè)務(wù)向云端和移動互聯(lián)網(wǎng)上的遷移,真實線上環(huán)境的復(fù)雜性,巨大的流量壓力,以及IT架構(gòu)的高可用問題,都會造成Python應(yīng)用的性能瓶頸。作為Pythoner的你是否常被這幾個問題所困擾:
l 代碼執(zhí)行速度真的很快嗎?
l 代碼性能瓶頸出在哪里?
l 內(nèi)存消耗大不大?
l 是否存在內(nèi)存泄漏?
透視寶Python監(jiān)控實現(xiàn)原理
在剛剛舉行的PyConChina 2015大會上,國內(nèi)領(lǐng)先的應(yīng)用性能管理服務(wù)商云智慧VP劉國強 (Bruce Liu)先生,為廣大Pythoner帶來《Python 應(yīng)用性能管理》主題分享,和大家一同探討云智慧透視寶是如何保障Python應(yīng)用在生產(chǎn)環(huán)境下的高性能。
針對復(fù)雜的IT架構(gòu),云智慧采用Backbone分布式監(jiān)測節(jié)點監(jiān)控,實現(xiàn)系統(tǒng)統(tǒng)一調(diào)度監(jiān)控任務(wù),所有監(jiān)控點同步執(zhí)行,依賴可靠的骨干網(wǎng)監(jiān)測點執(zhí)行監(jiān)控任務(wù),技術(shù)上消除網(wǎng)絡(luò)抖動和噪聲帶來的干擾,穩(wěn)定可靠的數(shù)據(jù)可以用于評估SLA。
而部署在應(yīng)用系統(tǒng)中的智能探針會根據(jù)應(yīng)用系統(tǒng)的語言,自動安裝對應(yīng)的探針程序,并為系統(tǒng)繪制應(yīng)用拓?fù)?。透視寶Python探針pythonAgent會在框架的RequestHandler添加上下文管理器(context manager),通過Smartpythonagent模塊實現(xiàn)上下文管理協(xié)議的__enter__() 和 __exit__() 方法控制tracer進(jìn)程的起始和結(jié)束。Tracer進(jìn)程通過python的sys.settrace()庫方法進(jìn)行開啟和結(jié)束代碼的trace過程。
Output模塊會對tracer進(jìn)程返回的代碼trace信息進(jìn)程處理生成我們想要的數(shù)據(jù)。其中的tree是對代碼執(zhí)行過程以方法名作為節(jié)點生成樹狀的結(jié)構(gòu),能直接通過tree來還原代碼執(zhí)行時的方法調(diào)用過程。而Map則記錄tree中每個節(jié)點的執(zhí)行信息,如消耗內(nèi)存,執(zhí)行時間等。Output模塊處理完數(shù)據(jù)后會向smartAgent的sendproxy發(fā)送數(shù)據(jù),***sendproxy會向透視寶服務(wù)器發(fā)送數(shù)據(jù)。 pythonAgent的tracer進(jìn)程能跟蹤到'call', 'line', 'return', 'exception', 'c_call', 'c_return', or 'c_exception'事件。
依托于各種Web輕量級應(yīng)用框架, Python在Web應(yīng)用上得到最廣泛支持,而透視寶的SmartAgent支持主流的Django、Tornado、CherryPy、Flask、Pylons、Bottle等應(yīng)用框架,保證Python代碼性能數(shù)據(jù)抓取的準(zhǔn)確性和高效能。配合透視寶部署在服務(wù)端的其他應(yīng)用服務(wù)監(jiān)控,包括Apache、Nginx、Tomcat、Weblogic、MySQL、Memcache、Redis、Oracle、MongoDB、PostgreSQL等,開發(fā)和運維人員能夠***時間發(fā)現(xiàn)應(yīng)用系統(tǒng)的潛在問題,準(zhǔn)確定位應(yīng)用執(zhí)行緩慢的真實原因。
如何利用透視寶監(jiān)控Python應(yīng)用
用戶可以訪問透視寶產(chǎn)品網(wǎng)站:http://toushibao.com/ ,申請免費試用帳號,進(jìn)入應(yīng)用管理,下載Smart Agent并進(jìn)行安裝,安裝完成訪問“系統(tǒng)→插件管理”,找到Smart Agent所安裝的主機,按以下說明來安裝、配置及開啟相關(guān)代碼插件。
1、安裝Python應(yīng)用發(fā)現(xiàn)插件
根據(jù)Web容器類型安裝應(yīng)用發(fā)現(xiàn)插件,該插件可自動發(fā)現(xiàn)容器內(nèi)的所有應(yīng)用實例并生成應(yīng)用拓?fù)鋱D。
l 如果直接使用的Python Server,可以直接跳過本步驟。
l 如果Web容器為Apache
請安裝并配置Apache類型的應(yīng)用發(fā)現(xiàn)插件ApacheApp,配置完成后開啟插件。
l 如果Web容器是Nginx
請首先在插件的配置界面中選擇安裝Nginx類型的應(yīng)用發(fā)現(xiàn)插件NginxApp。安裝完成之后您還需要配置Nginx插件,與Apache不同的是,此時您需要在主機上手工編譯,請參考安裝目錄中“./plugins/nginx_path/README”文檔。
2、安裝并開啟Python代碼監(jiān)控插件PythonCode
選擇PythonCode插件安裝并開啟,SmartAgent將自動下載插件至安裝目錄的smart_agent/plugins下。
默認(rèn)會使用系統(tǒng)Python進(jìn)行安裝。修改PythonAgent.sh中PythonCommand值,可安裝至系統(tǒng)中其他Python環(huán)境。
3、重啟Web Server
安裝開啟Python代碼監(jiān)控插件后,可能需要您手動重啟web Server(apache\httpd\Nginx\Python Server等軟件)。
4、查看Python應(yīng)用數(shù)據(jù)
配置完成后,大致兩分鐘后您就可以在“應(yīng)用”模塊中查看數(shù)據(jù)。