1. 程式人生 > >ASP.NET Core 效能對比評測(ASP.NET,Python,Java,NodeJS)

ASP.NET Core 效能對比評測(ASP.NET,Python,Java,NodeJS)

前言 效能是我們日常生活中經常接觸到的一個詞語,更好的效能意味著能給我們帶來更好的使用者體檢。比如我們在購買手機、顯示卡、CPU等的時候,可能會更加的關注於這樣指標,所以本篇就來做一個性能評測。

效能也一直是我們開發人員一直追求的一個目標,我們在做語言選擇,平臺選擇,架構選擇的過程中都需要在效能之間做衡量。

同樣效能對 .NET Core 團隊來說也是至關重要的,一項新技術的誕生,除了對生產力的提高,還有技術團隊對效能的追求。

今天,我們就來做一個對比測試,來看看微軟的這樣新技術效能到底怎麼樣,俗話說的好:“是騾子是馬,拉出來溜溜”。

下面讓我開始吧。

目錄 測試目標 測試工具 環境準備 開始測試

ASP.NET Core Kestrel vs ASP.NET Core IIS ASP.NET Core IIS vs ASP.NET IIS ASP.NET Core Kestrel vs ASP.NET IIS ASP.NET Core vs Python Django ASP.NET Core vs Java Servlet ASP.NET Core vs NodeJS 總結 測試目標 在測試之前,我們必須要明確我們本次測試想達到的一個目標。本次測試主要是測試應用程式的一個吞吐量。其中QPS,併發數,響應時間是我們衡量吞吐量的幾個重要指標。

以下是本次對比測試的任務目標:

編號 對比方 系統環境 宿主環境 測試目標 1

ASP.NET Core vs ASP.NET Core Windows Kestrel vs IIS 相同平臺不同宿主間效能差距 2 ASP.NET Core vs ASP.NET Windows IIS vs IIS 相同平臺相同宿主不同框架間效能差距 3 ASP.NET Core vs ASP.NET Windows Kestrel vs IIS 相同平臺不同宿主不同框架間效能差距 4 ASP.NET Core vs Python Django Linux Kestrel vs uwsgi 相同平臺不同語言不同宿主不同框架間效能差距 5 ASP.NET Core vs Java Servlet Linux Kestrel vs Tomcat 相同平臺不同語言不同宿主不同框架間效能差距 6-1
ASP.NET
Core vs NodeJS Express Linux Kestrel vs self host 相同平臺不同語言不同宿主不同框架間效能差距 6-2 ASP.NET Core vs NodeJS Koa Linux Kestrel vs self host 相同平臺不同語言不同宿主不同框架間效能差距 測試工具 工欲善其事,必先利其器。

首先我們需要一個壓力測試工具,本次我們使用 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%的效能。