上次的測試見《小測幾種python web server的效能
》。前兩天參加了pycon2012上海站。雖然今年的pycon被各種吐槽,但還是有點收穫的。比如shellxu的元程式設計,賴總的state/message,沈大俠談的pypy等。
回來就想測一下用pypy跑web應用看看效能如何。順便也對上次的測試範圍作了點擴大化。
pycon上談到的pyramid我雖然沒用過,但是前身pylons和turbogears我是用過的,只是現在對這種重量級的東西興趣不大。
輕量級的框架除了上次測試用到的web.py以外,bottle和flask也是很熱的東西,尤其是flask,但是因為它對werkzeug的依賴令我不是很喜歡——我不喜歡名字不好念的東西,除了werkzeug以外還有像django這種。
不過這次還是都拿來測了。軟硬體環境與上次測試相同。測試**功能都是 your ip。bottle和flask的測試**由令狐蟲(友情提供,特此鳴謝。
server都是用的gunicorn default(sync),單程序。沒有特別精確統計,取近似平均值。
rps測試
wsgi helloworld
web.py yourip
bottle your ip
flask your ip
python
850440
580400
pypy(*)
1100
8001000
600就這個結果來看,pypy的作用還是比較明顯的。另外flask看上去也一般啊,雖然號稱擴充套件能力強,不知道擴下去效能是不是會影響更大。但bottle的確是很不錯的樣子。
(*)當然因為pypy是jit方式執行的,所以有乙個「預熱」的過程。請求量過小的時候不但不會更快,反而會慢很多。基本上在「冷」狀態下,pypy環境下的rps只有python環境的一半不到。需要有連續大量請求之後才能達到「熱」狀態。上面的rps資料都是「熱」狀態的結果。
達到「熱」狀態的過程也各不相同。標準wsgi在幾百個請求之後即可達到,bottle大概需要一千多個請求,web.py需要將近一萬個請求,而flask要超過一萬。
另外,就測試的軟硬體環境來說,gunicorn default(sync)單程序最高只能達到130個併發左右,4程序可以達到270個併發左右。因為換用不同的框架結果都是如此,當然標準wsgi會略高一些(單程序170左右),所以主要應該還是gunicorn決定。
換用gunicorn+gevent測試的話,所有框架上到單程序1000併發沒問題,只是rps會有相應下降而已。這個時候就體現出gevent相比sync的優勢所在了——雖然低併發時sync速度比gevent還快,但是在高併發下,sync直接死掉(無響應直至超時),gevent只是速度慢了而已。
同樣換用gunicorn+meinheld,最高併發也只能到260而已,只比sync模式高一倍,但還是遠低於gevent。而且meinheld的表現比較奇怪,一開始還可以接受1000併發的,然後就越來越少。另外,它的表現也與gevent不同,gevent在高併發下是一開始就按比較低rps工作,而meinheld則是仍然以高rps工作,但到後面就會爆掉(客戶端顯示連線被服務端中斷)。
經令狐分析,可能的原因是這樣的:
sync從字面上理解應該是使用執行緒阻塞模式,所以在低併發下可以利用到伺服器的多核,所以rps比gevent要高。但是在高併發下,因為執行緒過多,導致執行緒切換成本過高失去響應。
meinheld應該也是使用了多執行緒(同時使用greenlet的協程),所以效能最好,但是在高併發下同樣會面臨與sync一樣的多執行緒問題。
gevent則勝在輕量,雖然沒有多執行緒利用多核的優勢,但同樣可以用多程序來利用,而且在高併發的時候,處理不了的請求是在排隊中,所以不會爆掉或死掉,只是rps下降而已。當然,在極端高併發的情況下,請求佇列是有可能溢位的,但那已經是比sync/meinheld高得多得多的併發了。
不過之前對meinheld過於樂觀的看法是需要改變了,因為在同樣高併發的情況下,nginx毫無壓力,雖然rps下降不少,但仍然是遠高於gevent,更不用說已經趴下的sync和meinheld……
最後,在測試中還發現了bottle的乙個效能問題:404錯誤的響應比正常頁面慢很多。令狐因此對測試程式作了改進,加了乙個自定義404頁面,這樣404的響應就和正常頁面差不多了。這一點在使用bottle時需要作為乙個注意事項加以考慮。
盤古分詞小測
編譯了以後,跟蹤了一下 應該是高手寫的,非常的清晰。只是因為沒有文件,時間有限,不能深入研究它的演算法。基本的演算法是這樣的 比如句子 盤古分詞 簡介 盤古分詞 是由eaglet 開發的一款基於字典的中英文分詞元件 先根據 非中文符號,對句子進行切分,如下 盤古分詞 簡介 盤古分詞 是由 eagle...
python函式小測
1.程式設計實現9 9乘法表 1x1 1 2x1 2 2x2 4 for i in range 1,10 for j in range 1,i 1 print dx d d j,i,i j end print 2.用函式實現求100 200裡面所有的素數 def isprime a 100,b 20...
C語言小測1
include include intmain return0 include intmain return0 給乙個正整數n,計算它最多能被2的多少次冪整除 include intmain printf d n i return0 輸入乙個正整數n 3 n 100000 輸出3,6,9,即輸出所有...