前言
測試非同步與同步下Python對於PostgreSQL資料庫操作的效能
通過測試同步以及非同步下對於資料庫的增加和查詢操作,以進行效能評估。更直觀的以及量化地感受同步以及非同步下的效能差距。
環境初始化
需要安裝pipenv
,詳細內容可參考
pip3.6 install pipenv
git clone https://github.com/GuangTianLi/python-sql-performance.git
cd python-sql-performance
pipenv sync
pipenv shell
SQL操作效能評估
python postgresql_speed_test.py
DBAPI: psycopg2
11004 function calls in 2.235 seconds
DBAPI: asyncpg
471973 function calls in 2.436 seconds
DBAPI: uvloop
206945 function calls in 0.794 seconds
DBAPI: psycopg2, total seconds 2.558364
DBAPI: asyncpg, total seconds 2.309759
DBAPI: uvloop, total seconds 2.032303
結論
從結果上看,對於資料庫操作本身,非同步對於其效能本身只能算是錦上添花。而非同步操作本身則也需要新增對事件迴圈的處理,等於是變相的增加了執行時間,而如果每個資料庫操作本身所需要的時間小於事件迴圈處理的時間,則其總時間就是增加的。
所以非同步架構在用於單純的資料庫操作時,並不能取得非常良好的效能優化,資料庫操作本身的優化還是依賴於操作本身以及資料庫結構的優化。
WebServer效能評估
flask
python flask_server_speed_test.py
wrk -d 60 -c 100 -t 12 --timeout 8 http://127.0.0.1:8080/db
Running 1m test @ http://127.0.0.1:8080/db
12 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 331.47ms 221.85ms 2.01s 89.71%
Req/Sec 30.95 17.90 80.00 63.85%
18597 requests in 1.00m, 3.10MB read
Requests/sec: 309.41
Transfer/sec: 52.88KB
sanic
python sanic_server_speed_test.py
wrk -d 60 -c 100 -t 12 --timeout 8 http://127.0.0.1:8080/db
Running 1m test @ http://127.0.0.1:8080/db
12 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 162.95ms 99.56ms 1.89s 87.88%
Req/Sec 52.26 23.73 148.00 61.57%
36702 requests in 1.00m, 4.83MB read
Requests/sec: 610.64
Transfer/sec: 82.29KB
結論
從中等量級的壓測的結果上看,對於非同步架構的網路伺服器,在效能上有了很大的提升。