ASP.NET Core 效能對比評測(ASP.NET,Python,Java,NodeJS)
前言 效能是我們日常生活中經常接觸到的一個詞語,更好的效能意味著能給我們帶來更好的使用者體檢。比如我們在購買手機、顯示卡、CPU等的時候,可能會更加的關注於這樣指標,所以本篇就來做一個性能評測。
效能也一直是我們開發人員一直追求的一個目標,我們在做語言選擇,平臺選擇,架構選擇的過程中都需要在效能之間做衡量。
同樣效能對 .NET Core 團隊來說也是至關重要的,一項新技術的誕生,除了對生產力的提高,還有技術團隊對效能的追求。
今天,我們就來做一個對比測試,來看看微軟的這樣新技術效能到底怎麼樣,俗話說的好:“是騾子是馬,拉出來溜溜”。
下面讓我開始吧。
目錄
測試目標
測試工具
環境準備
開始測試
以下是本次對比測試的任務目標:
編號 對比方 系統環境 宿主環境 測試目標
1
首先我們需要一個壓力測試工具,本次我們使用 wrk,有關於wrk的介紹和使用,請檢視我的 這篇部落格。
然後我們需要一個性能監控工具,因為wrk已經會給我們輸出吞吐量相關指標,所以我們只需要一個監控CPU,記憶體等的工具即可。本次我們使用 Windows 自帶的效能監視器。
Windows 效能監視器的開啟方式:開始–>執行–>perfmon PS: 在下面的監視器圖中如果你發現cpu並沒有100%,那是因為使用的虛擬機器佔用了一部分cpu,所以計算方式應該是虛擬機器的cpu使用量+物理機cpu使用量。
環境準備 既然做測試,首先肯定是具有相同的執行環境,以下是本次測試使用到的軟體和硬體環境。
軟硬體環境 名稱 作業系統 職責 CPU 核心數 記憶體 物理機器1 Windows 10 RS1 Web Server && 負載生成 Intel Core i5-4590 4 16G 虛擬機器器2 Ubuntu Server 16.04 Web Server Intel Core i5-4590 2 1G 虛擬機器器3 Nano Server Web Server Intel Core i5-4590 2 1G 其中 虛擬機器器2 為 “物理機器1” 使用 win 10 的 Hyper-v 技術搭建的一個虛擬機器,所以有幾個指標對於本次測試至關重要。
image
虛擬機器設定為了2個虛擬核心,以便於在壓力測試的過程中利用到多核特性。其中的虛擬機器保留百分比,需要設定為100%,來分配兩個物理cpu所有資源給它。佔綜系統資源百分比設定為50,也就是說虛擬機器最多利用本地50%的CPU資源,虛擬機器限制設定為100。
原始碼 AspNet 在 GitHub 有一個開源的效能測試專案叫benchmarks,之前新聞中23倍的效能也是出自於本測試專案, 為了客觀,本次測試並不使用該專案,所有專案均我們自己新建,並且使用當前流行的框架,為了排除程式碼因素的干擾,我們使用最簡單的 Hello World!。
如果你覺得本程式碼不夠客觀公正,歡迎在GitHub上Fork本專案,修改後給我提交PR,我會重新進行測試,並且更新本部落格。
開始測試 wkr命令引數:
wrk -t 2 -c 50 -d 20 --latency http://xxx 因為已經分配了2個核心給虛擬機器使用,所以開的是雙執行緒。使用這個引數是我經過多次測試,得到的一個最佳的模擬效果。
環境:物理機器1 OS:Windows 10 RS 1 Host:Kestrel wrk -t 2 -c 50 -d 20 --latency http://localhost:5000
Running 20s test @ http://localhost:5000 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 5.49ms 21.72ms 358.18ms 98.99% Req/Sec 23.28k 1.98k 27.48k 92.13% Latency Distribution 50% 0.00us 75% 6.87ms 90% 12.76ms 99% 28.58ms 913567 requests in 20.02s, 115.00MB read Requests/sec: 45636.43 Transfer/sec: 5.74MB ASP.NET Core
環境:物理機器1 OS:Windows 10 RS 1 Host:IIS 10.0 wrk -t 2 -c 50 -d 20 --latency http://localhost:5001
Running 20s test @ http://localhost:5001 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 5.30ms 5.81ms 22.24ms 76.75% Req/Sec 7.61k 455.21 8.12k 90.00% Latency Distribution 50% 3.14ms 75% 9.02ms 90% 15.62ms 99% 17.17ms 302880 requests in 20.02s, 44.77MB read Requests/sec: 15130.97 Transfer/sec: 2.24MB 總結:
QPS(Kestrel):45636.43 QPS(IIS):15130.97
這個結果難免令人詫異,程式部署在IIS上和使用Kestrel竟然差別如此之大,我們知道實際上即便部署在IIS上,實際上內部還是呼叫的Kestrel,但是測試結果告訴了我們答案。可能是由於IIS進一步的http封裝導致的吧,畢竟IIS提供了那麼多的其他功能。
以下是Windows的效能監視器,兩個的曲線圖差不多我就放一個了: image
紅色:CPU使用率 藍色:記憶體使用率 2 - ASP.NET Core vs ASP.NET(IIS vs IIS) ASP.NET Core
環境:物理機器1 OS:Windows 10 RS Host:IIS wrk -t 2 -c 50 -d 20 --latency http://localhost:5001
Running 20s test @ http://localhost:5001 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 5.30ms 5.81ms 22.24ms 76.75% Req/Sec 7.61k 455.21 8.12k 90.00% Latency Distribution 50% 3.14ms 75% 9.02ms 90% 15.62ms 99% 17.17ms 302880 requests in 20.02s, 44.77MB read Requests/sec: 15130.97 Transfer/sec: 2.24MB ASP.NET
環境:物理機器1 OS:Windows 10 RS Host:IIS .NET Framework 4.6 + MVC5 wrk -t 2 -c 50 -d 20 --latency http://localhost:10280
Running 20s test @ http://localhost:10280 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.94ms 5.58ms 22.82ms 80.90% Req/Sec 9.10k 444.04 9.42k 95.00% Latency Distribution 50% 3.00ms 75% 10.10ms 90% 13.57ms 99% 16.45ms 362177 requests in 20.00s, 89.80MB read Requests/sec: 18104.50 Transfer/sec: 4.49MB 總結:
QPS(ASP.NET Core + IIS):15130.97 QPS(ASP.NET + IIS):18104.50
看到這個結果的時候,其實我還是有一點小驚訝的,不僅僅是因為ASP.NET跑出了1.8K QPS這樣的成績,而是通過Stdev可以看出,ASP.NET 在應對高請求高併發的時候,還是相當的穩定的。這個結果說明了,在同樣Windows+IIS環境中,ASP.NET是具有優勢和競爭力的,可以預見 ASP.NET 應該還不會淘汰的太快。
Windows效能圖我就不上了,基本上和上面一樣 CPU 100% 的使用率。
環境:物理機器1 OS:Windows 10 RS 1 Host:Kestrel wrk -t 2 -c 50 -d 20 --latency http://localhost:5000
Running 20s test @ http://localhost:5000 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 5.49ms 21.72ms 358.18ms 98.99% Req/Sec 23.28k 1.98k 27.48k 92.13% Latency Distribution 50% 0.00us 75% 6.87ms 90% 12.76ms 99% 28.58ms 913567 requests in 20.02s, 115.00MB read Requests/sec: 45636.43 Transfer/sec: 5.74MB ASP.NET
環境:物理機器1 OS:Windows 10 RS Host:IIS .NET Framework 4.6 + MVC5 wrk -t 2 -c 50 -d 20 --latency http://localhost:10280
Running 20s test @ http://localhost:10280 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.94ms 5.58ms 22.82ms 80.90% Req/Sec 9.10k 444.04 9.42k 95.00% Latency Distribution 50% 3.00ms 75% 10.10ms 90% 13.57ms 99% 16.45ms 362177 requests in 20.00s, 89.80MB read Requests/sec: 18104.50 Transfer/sec: 4.49MB 總結
QPS(ASP.NET Core + Kestrel):45636.43
QPS(ASP.NET + IIS):18104.50
這個結果應該是在預料之中的,大概是3倍的效能差距吧。但是我覺得和之前微軟宣傳的23倍的效能,是有很大差距的。
4 - ASP.NET Core vs Python Django 注意,以下我們開始使用到虛擬機器器2了,我們要在Windows效能監控器裡面檢視CPU使用率,還需要再新增2個計數器。
物理處理器 \Hyper-V Hypervisor Logical Processor(*) %Total Run Time
虛擬處理器 \Hyper-V Hypervisor Virtual Processor(*) %Guest Run Time
環境:虛擬機器器2 OS:Linux Host:Kestrel wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:5000/ Running 20s test @ http://192.168.2.48:5000/ 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.39ms 5.33ms 33.05ms 77.20% Req/Sec 13.43k 1.32k 17.95k 74.75% Latency Distribution 50% 2.00ms 75% 8.15ms 90% 13.75ms 99% 15.80ms 534787 requests in 20.01s, 67.32MB read Requests/sec: 26730.83 Transfer/sec: 3.37MB image
Python Django
環境:虛擬機器器2 OS:Linux Host:uwsgi Python 2.7.12 + Django 1.10.2 服務端宿主執行命令:
sudo uwsgi --http :8000 --file HelloWorldWebApp/wsgi.py --processes=2 --threads==2 --daemonize=/var/log/django.log 結果:
wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:8000 Running 20s test @ http://192.168.2.48:8000 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 23.40ms 12.23ms 78.13ms 74.81% Req/Sec 792.64 143.13 1.25k 67.10% Latency Distribution 50% 21.16ms 75% 31.25ms 90% 38.26ms 99% 53.75ms 31591 requests in 20.09s, 3.01MB read Socket errors: connect 0, read 31591, write 0, timeout 0 Requests/sec: 1572.64 Transfer/sec: 153.67KB image
總結
QPS(ASP.NET Core + Kestrel):26730.83
QPS(Python Django + Kestrel ):1572.64
不知道是我執行的方式不對還是怎麼,這個差距還是蠻大的,大概是17倍的差距。看來Python Web 在做針對於做大請求併發情況下,還是弱了一點。
5 - ASP.NET Core vs Java Servlet C# 和 JAVA 一直是兩大陣營的開發人員喜歡討論的話題,為了避免有陣營偏見,JAVA的原始碼是我委託我們一個JAVA同事編寫的,並且委託由他部署的,並且已經交代了他避免使用jsp,由Servlet直接輸出。
環境:虛擬機器器2 OS:Linux Host:Kestrel wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:5000/ Running 20s test @ http://192.168.2.48:5000/ 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.39ms 5.33ms 33.05ms 77.20% Req/Sec 13.43k 1.32k 17.95k 74.75% Latency Distribution 50% 2.00ms 75% 8.15ms 90% 13.75ms 99% 15.80ms 534787 requests in 20.01s, 67.32MB read Requests/sec: 26730.83 Transfer/sec: 3.37MB image
Java Servlet
環境:虛擬機器器2 OS:Linux Host:Tomcat 7.0 + jdk 1.7 wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:8080/j2eeWebApp/hello Running 20s test @ http://192.168.2.48:8080/j2eeWebApp/hello 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.93ms 6.17ms 68.17ms 81.53% Req/Sec 9.22k 1.01k 14.06k 70.50% Latency Distribution 50% 1.75ms 75% 9.91ms 90% 14.39ms 99% 22.10ms 367733 requests in 20.05s, 93.70MB read Requests/sec: 18338.73 Transfer/sec: 4.67MB image
總結
QPS(ASP.NET Core + Kestrel):26730.83
QPS(Java Servlet + Tomcat):18338.73
通過這個結果我們可以看出,在效能上 ASP.NET Core 已經超越了Java。不說太多了,怕被噴…
環境:虛擬機器器2 OS:Linux Host:Kestrel wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:5000/ Running 20s test @ http://192.168.2.48:5000/ 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.39ms 5.33ms 33.05ms 77.20% Req/Sec 13.43k 1.32k 17.95k 74.75% Latency Distribution 50% 2.00ms 75% 8.15ms 90% 13.75ms 99% 15.80ms 534787 requests in 20.01s, 67.32MB read Requests/sec: 26730.83 Transfer/sec: 3.37MB NodeJS
環境:虛擬機器器2 OS:Linux Host:self host wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:1337 Running 20s test @ http://192.168.2.48:1337 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.40ms 5.23ms 31.25ms 79.47% Req/Sec 10.32k 0.88k 11.37k 90.25% Latency Distribution 50% 2.08ms 75% 8.32ms 90% 13.19ms 99% 15.93ms 410902 requests in 20.02s, 61.13MB read Requests/sec: 20522.89 Transfer/sec: 3.05MB image
********更新1:NodeJS 新增Web框架
Express框架,cluster模式
wrk -t 2 -c 30 -d 20 --latency http://192.168.2.48:1337 Running 20s test @ http://192.168.2.48:1337 2 threads and 30 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.97ms 1.45ms 32.23ms 83.97% Req/Sec 7.83k 0.90k 8.82k 91.50% Latency Distribution 50% 2.00ms 75% 2.50ms 90% 3.50ms 99% 6.00ms 311896 requests in 20.01s, 66.03MB read Requests/sec: 15583.99 Transfer/sec: 3.30MB Koa框架,cluster模式
wrk -t 2 -c 30 -d 20 --latency http://192.168.2.48:1337 Running 20s test @ http://192.168.2.48:1337 2 threads and 30 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.74ms 0.86ms 13.59ms 86.65% Req/Sec 8.79k 804.39 9.98k 87.75% Latency Distribution 50% 1.99ms 75% 2.00ms 90% 2.96ms 99% 4.83ms 349856 requests in 20.02s, 53.38MB read Requests/sec: 17478.73 Transfer/sec: 2.67MB 從測試結果可以看出,Koa框架效能略高於Express框架。
***End
總結
QPS(ASP.NET Core + Kestrel):26730.83
QPS(NodeJS):20522.89 (非cluster模式) QPS(NodeJS Express):15583.99 (cluster模式) QPS(NodeJS Koa):17478.73 (cluster模式)
這個結果著實讓我吃了一驚,NodeJS效能竟然如此驚人,比JAVA要快10%。作為一個解釋性語言這個效能可以說達到了極致,雖然在測試之前知道NodeJS採用的是非同步IO,但還是被測試結果震驚了。
===更新1=
NodeJS 在加入了Web框架之後,效能仍然不弱。
不知道是不是因為NodeJS沒有經過什麼Web框架,直接輸出的結果。所以我需要再加測一個ASP.NET Core 通過中介軟體直接輸入結果的效能,這次我要使用微軟的測試專案benchmarks。
wrk -t 2 -c 50 -d 20 --latency http://192.168.2.48:5000/plaintext Running 20s test @ http://192.168.2.48:5000/plaintext 2 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 3.69ms 5.03ms 18.30ms 80.38% Req/Sec 25.06k 4.14k 29.19k 83.33% Latency Distribution 50% 806.00us 75% 6.82ms 90% 12.62ms 99% 15.63ms 1002476 requests in 20.10s, 126.20MB read Requests/sec: 49874.57 Transfer/sec: 6.28MB My God !!!
總結 以下是測試結果的彙總統計:
編號 對比方 系統環境 宿主環境 測試結果(QPS) 1 ASP.NET Core vs ASP.NET Core Windows Kestrel vs IIS 45.6k vs 15.2k 2 ASP.NET Core vs ASP.NET Windows IIS vs IIS 15.2k vs 18.2k 3 ASP.NET Core vs ASP.NET Windows Kestrel vs IIS 45.6k vs 18.2k 4 ASP.NET Core vs Python Django Linux Kestrel vs uwsgi 26.7k vs 1.57k 5 ASP.NET Core vs Java Servlet Linux Kestrel vs Tomcat 26.7k vs 18.3k 6-1 ASP.NET Core vs NodeJS Express Linux Kestrel vs self host 26.7k vs 15.6k 6-2 ASP.NET Core vs NodeJS Koa Linux Kestrel vs self host 26.7k vs 17.5k image
如果你覺得本篇部落格對您有幫助的話,感謝您的【推薦】,如果你對.NET Core感興趣可以關注我,我會定期在部落格分享關於.NET Core的學習心得。
==更新1 :2016-10-17 感謝園友“幻天芒” 關於NodeJS的貢獻
有園友反應NodeJS專案沒有使用web mvc框架,所以特更新,同時感謝 “幻天芒” 在github向nodeJS專案提交的PR。
1、新增node 多核cpu cluster 模式 2、新增node koa框架和express框架測試
更新測試結果。
==更新2 :2016-10-19 新增ASP.NET Core 在Windows Nano Server的測試結果
環境:虛擬機器器3,和Linux硬體一樣
wrk -t 2 -c 30 -d 20 --latency http://192.168.2.52:8000 Running 20s test @ http://192.168.2.52:8000 2 threads and 30 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.08ms 709.98us 31.25ms 77.30% Req/Sec 13.98k 1.38k 15.80k 87.75% Latency Distribution 50% 1.00ms 75% 1.03ms 90% 2.00ms 99% 3.45ms 556354 requests in 20.03s, 70.04MB read Requests/sec: 27780.50 Transfer/sec: 3.50MB 這個測試結果和微軟的測試結果是一致的,Nano Server大概比在Linux上高出5-10%的效能。
========更新3 :2016-12-30 新增 WebListener 測試 ======
WebListener 是基於 Http.sys 實現的非跨平臺只能運行於 Windows 的一個 web 伺服器,其目的我覺得是為了替代iis的效能不足問題。
引用自QQ群 Lyrics:我的理解是這樣的,Kestrel是跨平臺的,定義了一套通用的 feature,然而目前在windows平臺上,Kestrel所具備的feature 並沒有 http.sys 提供的那麼強大,為了使老系統能順利遷移到core上面,微軟不得已搞了一個能支援所有http.sys 的web server,就是weblistener, weblistener 能完整的利用 http.sys 的特性,在windows上功能完整。
測試結果:
Windows ASP.NET Core Kestrel :35.5k
Windows ASP.NET Core WebListener:27.9k
Kestrl 大概比 WebListener 高出 5-10%的效能。