1. 程式人生 > >web.py效能測試

web.py效能測試

一直從事後臺系統的開發工作,對web、甚至前端技術一無所知;為了響應leader提出的多面手號召,決定一探前端技術。由於個人對python是情有獨鍾,毅然決定從python web開發下手。在眾多的python web框架中,我看上了簡單、輕量的web.py,沒有特別喜歡的原因,就是簡單,下手成本較低,哈哈。不過自己對輕量級的東西都比較樂意接受,比如nginx。本文不會介紹web.py的開發、不會介紹環境部署,這些東西官網都有相當詳細的介紹,或者網上一堆一堆的文件。平時自己在調研新技術的順序基本是:文件詳細否、效能如何、穩定效能不能生產、功能是否滿足需求等。所以本文只是記錄自己對web.py框架和搭配nginx做的一個benchmark。

測試例子

#!/bin/env /usr/local/bin/python

import web 

web.config.debug = False

urls = ('/(.*)', 'hello')
app = web.application(urls, globals())

class hello:    
    def GET(self, name):
        if not name: 
            name = 'World'
            return 'Hello, ' + name + '! fuck the hello'

if __name__ == "__main__":
    app.run()

ps:貌似是從官網直接copy的demo,自己猥瑣的修改了一下。

測試工具
apache自帶的著名ab,雖然我認為它不怎麼樣,至少感覺沒它名聲那麼好。測試引數如下:

ab -n 10000 -c 100 http://127.0.0.1:1988/  

web.py效能

直接利用web.py內建的web server來啟動這個hello word服務,啟動時將標準輸出和標準錯誤重定向到/dev/null以此減少IO的消耗。benchmark如下圖:


web.py程式預設啟動雖然是多執行緒的(這個在/proc/pid裡面是可以看到的),但由於python多執行緒實現上的鎖問題,在併發上面一直沒有顯著的效果,所以這裡的benchmark有點慘不忍睹,至少讓研究高併發伺服器的會很不滿意。16核的cpu放在那裡一動不動的,好可惜啊。

nginx + spawn-fcgi + flup + web.py效能

這裡nginx沒有做任何調優,基本屬於預設配置,除了加入fastcgi相關指令外。web.py是利用spawn-fcgi啟動了32個程序,其實和16個程序沒有多大的區別。測試主機是8核、超執行緒到了16核;記憶體對本次測試不會構造影響。benchmark如下圖:


ps:採用這個的一個架構,效能有了明顯的提升了,qps是單web.py的8倍。效能的提升主要就是在python的多程序複用了多核cpu。16個核都跑到了70%-80%,基本屬於跑滿了;load也達到了50-60了。24G記憶體的測試主機,記憶體不是瓶頸。這個結果的優化空間應該也不會太大了,畢竟cpu幾乎跑滿了負載也上來了,cpu終究成為了瓶頸。

總結一點

高效能伺服器的設計可以採用多執行緒或多程序,最大的複用cpu。cpu就放在那裡,不用白不用。

錯誤小記

利用spawn-fcgi啟動web.py的測試程式時,總是丟擲如下錯誤, 最後發現居然是-f 選項指定的檔案沒有采用絕對路徑,spawn-fcgi的使用者體驗太低了。

spawn-fcgi: child exited with: 127