天天看點

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

 轉:https://www.cnblogs.com/savorboard/archive/2016/10/17/dotnet-benchmarks.html

前言

性能是我們日常生活中經常接觸到的一個詞語,更好的性能意味着能給我們帶來更好的使用者體檢。比如我們在購買手機、顯示卡、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

IIS

相同平台不同宿主間性能差距
2

ASP.NET Core

ASP.NET

IIS

IIS

相同平台相同宿主不同架構間性能差距
3

ASP.NET Core

ASP.NET

Kestrel

IIS

相同平台不同宿主不同架構間性能差距
4

ASP.NET Core

Python Django

Linux

Kestrel

uwsgi

相同平台不同語言不同宿主不同架構間性能差距
5

ASP.NET Core

Java Servlet

Kestrel

Tomcat

6-1

ASP.NET Core

NodeJS Express

Kestrel

self host

6-2

ASP.NET Core

NodeJS Koa

Kestrel

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 16G
虛拟機器2 Ubuntu Server 16.04 Web Server 1G
虛拟機器3 Nano Server

其中 

虛拟機器2

 為 “實體機器1” 使用 win 10 的 Hyper-v 技術搭建的一個虛拟機,是以有幾個名額對于本次測試至關重要。

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

虛拟機設定為了2個虛拟核心,以便于在壓力測試的過程中利用到多核特性。其中的虛拟機保留百分比,需要設定為100%,來配置設定兩個實體cpu所有資源給它。占綜系統資源百分比設定為50,也就是說虛拟機最多利用本地50%的CPU資源,虛拟機限制設定為100。

  • 源代碼

AspNet 在 GitHub 有一個開源的性能測試項目叫benchmarks,之前新聞中23倍的性能也是出自于本測試項目, 為了客觀,本次測試并不使用該項目,所有項目均我們自己建立,并且使用目前流行的架構,為了排除代碼因素的幹擾,我們使用最簡單的 Hello World!。

如果你覺得本代碼不夠客觀公正,歡迎在GitHub上Fork本項目,修改後給我送出PR,我會重新進行測試,并且更新本部落格。

GitHub: https://github.com/yuleyule66/AspNetCoreBenchmarksCompare

wkr指令參數:

wrk -t 2 -c 50 -d 20 --latency http://xxx           

因為已經配置設定了2個核心給虛拟機使用,是以開的是雙線程。使用這個參數是我經過多次測試,得到的一個最佳的模拟效果。

1 - ASP.NET Core vs ASP.NET Core(Kestrel vs IIS)

ASP.NET Core

  • 環境:實體機器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           
  • 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的性能螢幕,兩個的曲線圖差不多我就放一個了:

(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)
  • 紅色:CPU使用率
  • 藍色:記憶體使用率

2 - ASP.NET Core vs ASP.NET(IIS vs IIS)

  • 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

  • .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% 的使用率。

3 - ASP.NET Core vs ASP.NET(Kestrel vs IIS)

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           
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

這個結果應該是在預料之中的,大概是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
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           
(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)

Python Django

  • 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           
(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)

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直接輸出。

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           
(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)

Java Servlet

  • 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           
(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)

QPS(Java Servlet + Tomcat):18338.73

通過這個結果我們可以看出,在性能上 ASP.NET Core 已經超越了Java。不說太多了,怕被噴...

6 - ASP.NET Core vs NodeJS

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

  • 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           
(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)

***************更新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(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)

ASP.NET Core

ASP.NET Core

Kestrel

IIS

45.6k vs 15.2k

ASP.NET Core

ASP.NET

IIS

IIS

15.2k vs 18.2k

ASP.NET Core

ASP.NET

Kestrel

IIS

45.6k vs 18.2k

ASP.NET Core

Python Django

Kestrel

uwsgi

26.7k vs 1.57k

ASP.NET Core

Java Servlet

Kestrel

Tomcat

26.7k vs 18.3k

ASP.NET Core

NodeJS Express

Kestrel

self host

26.7k vs 15.6k

ASP.NET Core

NodeJS Koa

Kestrel

self host

26.7k vs 17.5k
(轉)ASP.NET Core 性能對比評測(ASP.NET,Python,Java,NodeJS)

作為微軟的下一代 ASP.NET 架構,ASP.NET Core沒有讓我們失望,通過本次測試,我們大概對ASP.NET Core的性能心裡有底了。一個圈子的良好發展需要社群的共同參與,也希望大家共同為.NET Core社群貢獻自己的力量,同時也希望看到本篇文章的CTOs們以後在平台和架構選擇的過程中考慮一下ASP.NET Core,因為她真的很優秀。

如果你覺得本篇部落格對您有幫助的話,感謝您的【推薦】,如果你對.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%的性能。