.NET 6 EFCore WebApi 使用 JMeter 進行吞吐量測試

2022-09-20 18:02:13

.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