ASP.NET Core performans testi ile node.js'nin beklenmeyen sonucu


177

Yazılan iki (merhaba) merhaba dünya projesinde hızlı bir stres testi yapıyorum ve . Her ikisi de üretim modunda ve bunlara bağlı bir kaydedici olmadan çalışıyor. Sonuç şaşırtıcı! ASP.NET çekirdeği bazı ekstra işler yaptıktan sonra bile node.js uygulamasından daha iyi performans gösterirken, node.js uygulaması yalnızca bir görünüm oluşturuyor.

Uygulama 1: http://localhost:3000/nodejs node.js

Kullanarak : node.js, ekspres ve vash oluşturma motoru.

nodejs uygulaması

Bu bitiş noktasındaki kod:

router.get('/', function(req, res, next) {
  var vm = {
    title: 'Express',
    time: new Date()
  }
  res.render('index', vm);
});

Gördüğünüz gibi, mevcut tarihi timedeğişken üzerinden görünüme göndermek dışında hiçbir şey yapmaz .

Uygulama 2: http://localhost:5000/aspnet-core asp.net core

Kullanılıyor : ASP.NET Core, varsayılan şablon hedeflemednxcore50

Ancak bu uygulama, üzerinde tarih bulunan bir sayfa oluşturmaktan başka bir şey yapmaz. Çeşitli rastgele metinlerden 5 paragraf oluşturur. Bu teorik olarak bu düğümü nodejs uygulamasından biraz daha ağır hale getirmelidir.

asp.net çekirdek uygulaması

İşte bu sayfayı oluşturan işlem yöntemi

[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
[Route("aspnet-core")]
public IActionResult Index()
{
    var sb = new StringBuilder(1024);
    GenerateParagraphs(5, sb);

    ViewData["Message"] = sb.ToString();
    return View();
}

Stres testi sonucu

Node.js Uygulama stres testi sonucu

Güncelleme: Gorgi Kosev'in önerisini takiben

kullanma npm install -g recluster-cli && NODE_ENV=production recluster-cli app.js 8

nodejs testi 2

ASP.NET Core App stres testi sonucu

asp.net çekirdek stres testi sonucu

Gözlerime inanamıyorum! Bu temel testte asp.net çekirdeğinin nodejs'den çok daha hızlı olduğu doğru olamaz. Tabii ki bu iki web teknolojisi arasındaki performansı ölçmek için kullanılan tek metrik değil, ama node.js tarafında neyi yanlış yaptığımı merak ediyorum? .

Profesyonel bir asp.net geliştiricisi olmak ve node.js'yi kişisel projelere uyarlamak isteyen bu, beni biraz rahatsız ediyor - performans hakkında biraz paranoyak olduğum için. Node.js'nin asp.net çekirdeğinden daha hızlı olduğunu düşündüm (genel olarak - diğer çeşitli kriterlerde görüldüğü gibi) Sadece kendime kanıtlamak istiyorum (node.js'yi uyarlamaya teşvik etmek için).

Daha fazla kod snippet'i eklememi istiyorsanız lütfen yorum olarak yanıtlayın.

Güncelleştirme: .NET Core uygulamasının zaman dağılımı

aspnetcore uygulaması zaman dağılımı

Sunucu cevabı

HTTP/1.1 200 OK
Cache-Control: no-store,no-cache
Date: Fri, 12 May 2017 07:46:56 GMT
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Server: Kestrel

52
"Hep düşündüm node.js hızlı asp.net çekirdek daha" - Niye böyle merak ediyorum? Bunu destekleyecek hiçbir ölçüt görmedim (node.js'yi benimsememin ana nedenleri "kullanım kolaylığı" ve "daha hızlı geliştirme / yineleme zamanı" idi)
UnholySheep

7
@UnholySheep Tüm duyduğum bu dostum, aynı zamanda "kullanımı kolay" ve "daha hızlı gelişmesi" de duydum, genellikle ASP.NET'te, özellikle VisualStudio'da hiç çalışmayan kişilerden. Herhangi bir teknoloji hakkında övünmüyorum - ama fark ettiğim kalıp bu.
undefined

3
Burada soru nedir? Eğer akla yatkın ise: Evet öyle. techempower.com/benchmarks/… .... Ayrıca alet zincirinizi güncelleyin Dnxcore50 en az bir ya da iki yıldır modası geçmiş.
Thomas

2
Küme modülünü kullanan @Tony NodeJs, birden fazla işçiyi doğurur ve tek bir süreçte dinleyen ana sürecin yükünü paylaşır. Sadece farklı bağlantı noktalarına birden fazla uygulama kurmak zorunda kalmaz. Ayrıca nodeJ'ler küme modunda çalışıyorsa, IIS'de farklı bağlantı noktalarında aynı sayıda Asp.Net WebApplications çalışmalı ve aralarında yükü bir dengeleyici aracılığıyla paylaşmalıdır, o zaman doğru karşılaştırma olacaktır.
Vipresh

36
Node.js birçok şey için harikadır, ancak istek başına ham hız bunlardan biri değildir. Nodu yeni ve parlak olduğunda büyük bir sorun olan engellemeyen olay döngüsü olayı nedeniyle G / Ç işlemleri için bir broker olmak. Tabii ki, o zamandan beri diğer diller ve çerçeveler yakalandı, bu yüzden .NET'te Görev Paralel Kütüphanesi ve asenkron I / O ve async / bekliyor. Düğümün üstünlüğü, sayfa oluşturma gibi CPU'ya bağlı işlemlerdir, çünkü tek iş parçacıklı JavaScripttir.
Mark Rendle

Yanıtlar:


188

Diğerlerinin de belirttiği gibi, karşılaştırma bağlamdan yoksundur.
Serbest bırakıldığı sırada node.js'nin zaman uyumsuz yaklaşımı devrimciydi. O zamandan beri diğer diller ve web çerçeveleri ana akım olarak benimsedikleri yaklaşımları benimsiyor.

Farkın ne anlama geldiğini anlamak için, veritabanı isteği gibi bazı IO iş yükünü temsil eden bir engelleme isteğini simüle etmeniz gerekir. İstek başına bir iş parçacığı sisteminde, bu iş parçacığı havuzunu tüketir ve yeni istekler, kullanılabilir bir iş parçacığını bekleyen bir sıraya alınır.
Tıkanmasız çerçevelerle bu gerçekleşmez.

Yanıt vermeden önce 1 saniye bekleyen bu node.js sunucusunu düşünün

const server = http.createServer((req, res) => {
  setTimeout(() => {
    res.statusCode = 200;
    res.end();
  }, 1000);
});

Şimdi 10 saniye boyunca ona 100 eşzamanlı konser atalım. Bu yüzden yaklaşık 1000 talebin tamamlanmasını bekliyoruz.

$ wrk -t100 -c100 -d10s http://localhost:8000
Running 10s test @ http://localhost:8000
  100 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.01s    10.14ms   1.16s    99.57%
    Req/Sec     0.13      0.34     1.00     86.77%
  922 requests in 10.09s, 89.14KB read
Requests/sec:     91.34
Transfer/sec:      8.83KB

Gördüğünüz gibi 922 ile basketbol sahasına giriyoruz.

Şimdi async / await henüz desteklenmemiş gibi yazılan aşağıdaki asp.net kodunu göz önünde bulundurun, bu nedenle bizi node.js başlatma çağına geri götürüyoruz.

app.Run((context) =>
{
    Thread.Sleep(1000);
    context.Response.StatusCode = 200;
    return Task.CompletedTask;
});

$ wrk -t100 -c100 -d10s http://localhost:5000
Running 10s test @ http://localhost:5000
  100 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.08s    74.62ms   1.15s   100.00%
    Req/Sec     0.00      0.00     0.00    100.00%
  62 requests in 10.07s, 5.57KB read
  Socket errors: connect 0, read 0, write 0, timeout 54
Requests/sec:      6.16
Transfer/sec:     566.51B

62! Burada threadpool sınırını görüyoruz. Bunu ayarlayarak daha fazla eşzamanlı istek elde edebiliriz, ancak daha fazla sunucu kaynağı pahasına.

Bu G / Ç'ye bağlı iş yükleri için, işleme iş parçacıklarını engellemekten kaçınma hareketi bu kadar çarpıcıydı.

Şimdi bu etkinin sektörde dalgalandığı ve dotnet'in geliştirmelerinden faydalanmasına izin verelim.

app.Run(async (context) =>
{
    await Task.Delay(1000);
    context.Response.StatusCode = 200;
});

$ wrk -t100 -c100 -d10s http://localhost:5000
Running 10s test @ http://localhost:5000
  100 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.01s    19.84ms   1.16s    98.26%
    Req/Sec     0.12      0.32     1.00     88.06%
  921 requests in 10.09s, 82.75KB read
Requests/sec:     91.28
Transfer/sec:      8.20KB

Burada sürpriz yok, şimdi node.js ile eşleşiyoruz.

Peki bütün bunlar ne anlama geliyor?

Node.js'nin "en hızlı" olduğu izlenimleriniz artık yaşamadığımız bir dönemden geliyor. Buna ek olarak "hızlı" olan hiçbir zaman düğüm / js / v8 değildi, istek başına iş parçacığını kırdılar modeli. Diğer herkes yetişiyor.

Hedefiniz, tekli isteklerin mümkün olan en hızlı şekilde işlenmesi ise , kendi isteklerinizi almak yerine ciddi ölçütlere bakın . Ancak bunun yerine istediğiniz şey basitçe modern standartlara göre ölçeklenen bir şeyse, istediğiniz dili seçin ve bu konuları engellemediğinizden emin olun.

Feragatname: Uykulu bir Pazar sabahı yaşlanan bir MacBook Air'de tüm kodlar yazılır ve testler yapılır. Kodu kapmaktan çekinmeyin ve Windows'da deneyin veya ihtiyaçlarınıza göre değiştirin - https://github.com/csainty/nodejs-vs-aspnetcore


35
NodeJ'ler hiçbir zaman benzersiz değildi, nodejs tanıtılmadan önce istekte Konu Başlığı modeli de Asp.Net'te mevcuttu. Örneğin. methodNameAsync
Vipresh

Örn. U, 2008 yılına dayanan DB operasyonlarıyla ilgili bu makaleye başvurabilir codedigest.com/Articles/ADO/…
Vipresh

4
"anaakım yaklaşımlar" - birkaç şey benzersizdir, konuyu çok daha geniş bir kitlenin önüne koyarlar. Mevcut bir yaklaşıma sahip olmak ve onu temel bir ilke olarak pişirmek iki farklı şeydir.
Chris Sainty

4
Burada en iyi cevap. Dönemi.
Narvalex

3
@LeeBrindley Kabul etmiyorum, bu verilen donanımın maksimum verimini göstermeye çalışmıyor, engelleme ve engellememe arasındaki farkı gösteriyor. Ham verim karşılaştırmaları istiyorsanız, teknoloji gücüne bağlanırım.
Chris Sainty

14

Express ve Koa gibi Düğüm Çerçevelerinin korkunç bir yükü var. "Ham" Düğüm çok daha hızlı.

Denemedim, ancak "Ham" Düğüm performansına çok yaklaşan daha yeni bir çerçeve var: https://github.com/aerojs/aero

(bu sayfadaki karşılaştırmaya bakın)

güncelleme: İşte bazı rakamlar: https://github.com/blitzprog/webserver-benchmarks

Node:
    31336.78
    31940.29
Aero:
    29922.20
    27738.14
Restify:
    19403.99
    19744.61
Express:
    19020.79
    18937.67
Koa:
    16182.02
    16631.97
Koala:
    5806.04
    6111.47
Hapi:
    497.56
    500.00

Gördüğünüz gibi, en popüler node.js çerçevelerindeki genel giderler ÇOK önemlidir!


5
numaralar ne için? Daha iyi daha iyi?
Iamisti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.