.NET 6 EFCore WebApi 使用 JMeter 進行吞吐量測試
開發環境
VS2022
.NET 6
測試環境
測試工具
介面壓力測試工具:JMeter
資料庫
MySQL 5.7
資料庫和WebApi服務在同一臺伺服器上,JMeter在本人筆電上。
測試設定
200個執行緒並行,每個執行緒迴圈50次,共10000次請求。
介面程式碼
模糊查詢、排序、分頁查詢第10頁200條資料,引數化查詢條件。
EFCore (第一輪請求),測試結果
服務程式部署到測試伺服器上測試,連線MySql資料庫。
吞吐量
只有200多
每個請求響應時間
最長5秒多
EFCore (第一輪請求結束後,20秒內進行第二輪請求),測試結果
服務程式部署到測試伺服器上測試,連線MySql資料庫。
經過第一輪10000個請求的充分預熱,取第二輪10000個請求的測試結果。
吞吐量
1200多
每個請求響應時間
不到50毫秒
執行緒佔用
最大達到143個執行緒
EFCore (第一輪請求結束後,20秒後進行第二輪請求),測試結果
吞吐量
1200
每次請求響應時間
100毫秒
執行緒佔用
只有50多個執行緒
使用FactoryStartNew. StartNewThread
查詢程式碼
FactoryStartNew. StartNewThread程式碼
使用FactoryStartNew. StartNewThread (第一輪請求),測試結果
服務程式部署到測試伺服器上測試,連線MySql資料庫。
吞吐量
不到200
每個請求響應時間
最長33秒
使用FactoryStartNew. StartNewThread (第一輪請求結束後,20秒內進行第二輪請求),測試結果
吞吐量
1000多
每個請求響應時間
200毫秒以內
執行緒佔用
高達260多個執行緒
使用FactoryStartNew. StartNewThread (第一輪並行請求結束後,20秒後進行第二輪請求),測試結果
吞吐量
只有200多
每個請求響應時間
最長達到了30秒
在等待建立執行緒,.NET預設執行緒池,1秒才增加一個執行緒
執行緒佔用
高達230多個執行緒
對比SqlSugar
同樣的資料庫,同樣的資料,同樣的查詢,同樣的JMeter測試設定,同樣取第二輪測試結果。
吞吐量
395
每個請求響應時間
500毫秒
對比FreeSql
同樣的資料庫,同樣的資料,同樣的查詢,同樣的JMeter測試設定,同樣取第二輪測試結果。
吞吐量
408
每個請求響應時間
不到500毫秒
對比Dapper.LiteSql
吞吐量
480多
每個請求響應時間
400多毫秒
結論
1. EFCore優秀,吞吐量和響應時間都非常優秀。
2. 使用FactoryStartNew. StartNewThread,能用,但有問題。
3. 如果覺得自己的ORM沒問題,那就沒有問題了,誰沒事閒的做這種測試,慢一點不會死人,使用者多了並行多了就加機器,作者和使用者永遠也不會知道,明明可以達到1000的吞吐量,卻一直用的280吞吐量的ORM。
4. 比EFCore慢不丟人。
5. 不要說程式碼怎麼寫的,我要看測試結果。
測試工程地址
https://gitee.com/s0611163/Net6WebApiPerformanceTest