Python Web服務器并發(fā)性能測試
測試條件
- 測試機器:四核,4GB內存
- 系統(tǒng)環(huán)境:Ubuntu 14.04 LTS
- 測試環(huán)境:django
- 測試工具:apache ab
- 測試參數(shù):1000個并發(fā) 1000~10000個請求
測試效果
- django
毫無疑問,用原生django的server做處理的表現(xiàn)是最爛的,在10000次請求的情況下brokenpipe的幾率極高,只有1400次請求被處理,成功率只有14%,我也懶得繼續(xù)測下去了。 - django + nginx
這次搭上了nginx做反向代理,也使的脆弱的django服務器的情況有所緩解,但成功率仍然不高(10000次請求中有3684個請求被處理)。 - uwsgi + nginx
uwsgi是性能極高的一個由C編寫的服務器,它使用uwsgi協(xié)議,這次讓它配合nginx處理django的request,參數(shù)為4進程+2線程,性能立即直線上升,處理請求的成功率也基本在90%左右,不過我在測試時遇到了一個坑,就是uwsgi在處理請求的時候發(fā)送了隊列溢出的問題,因為當前測試設置的并發(fā)數(shù)為每秒1000次并發(fā),而uwsgi的處理隊列容量默認為100,導致處理請求的時間加長,而這個問題則可以通過修改somaxcon的大小解決,總的來說,使用uwsgi+nginx是一個理想的選擇。 - gunicorn + nginx
gunicorn跟uwsgi類似,也是一個高性能的http服務器,它由ruby的unicorn項目移植,是由python編寫的,它的配置簡單,而且可以靈活地搭配其他網絡庫,部署十分方便,在測試數(shù)據中可以看到,用這種配置運行django能在短時間內就能處理大量的并發(fā)請求,成功率在90%左右。 - gunicorn + nginx + gevent
前面說的幾種環(huán)境,看似不錯,但我們需要追求完美!由于gunicorn是同步(sync)單線程模型的,有的時候它不免會發(fā)生一些阻塞問題,這時候我們?yōu)間unicorn加上-k gevent參數(shù)來用gevent做處理接口,這就比較靠譜地處理了阻塞問題,從數(shù)據中可以看到,gunicorn + nginx + gevent的模式不僅擁有100%的處理成功率,而且時間也在很短之內完成,是5組測試數(shù)據當中的性能最好的。
每秒發(fā)送1000次并發(fā)需要時間

1.png
每秒發(fā)送1000次并發(fā)有效請求

2.png
所有測試數(shù)據

3.png