Bàn về Nodejs, hiệu năng (performance) và những hiểu nhầm thường gặp phải
Tại sao NodeJS lại nhanh?
Đây là câu hỏi của khá nhiều newbie – những người không chịu dành nổi 5′ để tìm thông tin. Và là câu hỏi của khá nhiều người KHÔNG PHẢI LÀ NEWBIE, hay đại để là những người cứ hùng hục code mà ko hiểu cái gì thực sự diễn ra ở mức thấp hơn.Có 2 thứ theo mình khiến Node nhanh:
1. Single thread (và Event loop) – Thread được quản lý bởi Nodejs tại C Level.
2. Javascript trong NodeJS được thực thi bởi Google Chrome V8 Engine. (cái V8 Engine này bác nào cần thì tự tìm hiểu nhé)Thứ 1, Single Thread là gì? Để trả lời câu hỏi này bạn phải hiểu 2 mô hình web server truyền thống.
1. Cũ: mỗi request thì web server sẽ tạo một process để xử lý, có 1 triệu request thì tạo ra 1 triệu process.
2. Hiện đại: sử dụng Thread pool. Mỗi request được đưa vào 1 thread trong Thread pool, và hệ điều hành đc cài đặt trên webserver sẽ làm nhiệm vụ quản lý các thread này. Tuy cái này tiến bộ hơn mô hình cũ, nhưng khi có nhiều request thì sẽ sinh ra lãng phí RAM, CPU, hệ điều hành sẽ phải nai lưng ra làm nhiệm vụ giải phóng, cấp phát thread…
(Nếu bạn đã nghe nói tới Nginx thì sẽ biết là nó được sinh ra để giải quyết vấn đề này, Nginx chính là một single-threaded web server, có thể xử lý số lượng concurrent request rất lớn).NodeJS xử lý các request bên trong 1 thread (single thread) dựa trên Event Loop, việc này sẽ giúp bộ nhớ (RAM) cũng như CPU được giảm tải. Cứ mỗi request đi qua cái thread này thì nó sẽ được thực thi ngay và trả về kết quả khi thành công (hàm callback), các bạn nên biết là mô hình truyền thống trên kia thì thread sẽ phải đợi kết quả trả về xong thì mới có thể giải phóng được, còn với NodeJS thì nó chả đợi cái quách gì, cứ tới đây là anh tiếp nhận luôn, có kết quả a trả lại cho mày dùng! Đây cũng là lý do vì sao ng ta nhắc tới Nodejs thì hay dùng thuật ngữ non blocking
Tới đây thì có thể có một vài bạn chịu tìm tòi tự hỏi “Má, nếu NodeJS chỉ sử dụng single thread thì cái CPU nó sinh ra multithreading với cả đa nhân làm cái đếch gì, phí à???”.
Dĩ nhiên là không, cho nó xài nhiều nhân khá đơn giản với cluster module
(Rất tiếc là mình ko đưa code cũng như hình ảnh minh hoạ vào đây vì hạn chế status của FB, có lẽ hẹn anh em 1 bài blog sau).—
NodeJS bá đạo như vậy, nhưng các bạn vẫn luôn cần lựa chọn một cách khôn ngoan, và các bạn cần biết NodeJS phù hợp nhất với những ứng dụng gì.Câu trả lời đơn giản là: Viết các chương trình JS để giao tiếp với networks, file systems, hay các I/O resources khác (như input/output, reading/writing). Chỉ vậy thôi, mục đích của NodeJS chính là 1 I/O platform giúp bạn xây dựng được những ứng dụng đòi hỏi tốc độ nhanh và xử lý được lượng connection lớn. Ở những mức thấp hơn là những network programs sử dụng HTTP, TCP, UDP, DNS, SSL, các chương trình đọc viết dữ liệu tới file hệ thống hay bộ nhớ cục bộ…Một vài ví dụ: Websockets, HTTP + JSON, Files (image resizer, video editor, internet radio), caching proxy, Facebook/Twitter API, RedisDB, MongoDB, CouchDB…Và, quan trọng không kém, đừng hiểu lầm Nodejs là 1 trong những thứ sau:
1. A web framework (đếch giống Rails hay Django hay Laravel…đâu nhé).
2. A programming language (nó dùng Javascript, Node ko có ngôn ngữ riêng).
Tuy bây giờ với sức mạnh của Express và nhiều module khác NodeJS có thể làm được “mọi thứ” mà một web framework khác được (như 1 CRUD web app chả hạn), cá nhân mình cho rằng nhưng ứng dụng nặng về CRUD thì cứ Rails hay Django hay Laravel mà phang cho nhanh!
Có rất nhiều điều để nói về bài viết này nhưng kết luận đầu tiên của mình là nó không giúp cho người đọc “hiểu hơn”, mà khiến cho người đọc “hiểu sai”. Tác giả đề cập đến khá nhiều khái niệm, Process, Thread-Thread pool, nonblocking, performance… tuy nhiên hầu hết kiến thức đưa ra đều nhầm lẫn hoặc sai lệch, khiến cho kết luận cũng sai theo.
Trong bài viết dưới đây, mình sẽ đề cập đến vài vấn đề được nêu ra trong post nói trên, vừa nhằm mục đích phản biện, vừa nhằm phổ biến kiến thức.
Lưu ý: bài viết này nhằm mục đích phản biện khoa học chứ không nhắm đến bất cứ cá nhân hay cộng đồng nào. Nếu bạn là người không chịu được chỉ trích thì tốt nhất không nên đọc
1. Nodejs chạy nhanh?
Đây là một kết luận “bí hiểm” mà rất nhiều lập trình viên Nodejs mặc định cho là đúng. Trước hết, “nhanh” là một khái niệm mang tính so sánh, chúng ta cần phải hiểu xem Nodejs “nhanh” so với những công nghệ nào tương đương?
var http = require(‘http‘); | |
var fs = require(‘fs‘); | |
var cluster = require(‘cluster‘); | |
var numCPUs = require(‘os‘).cpus().length; | |
const message = “Hello world!“; | |
const contentType = “text/plain“; | |
if (cluster.isMaster) { | |
// Fork workers. | |
for (var i = 0; i < numCPUs; i++) { | |
cluster.fork(); | |
} | |
cluster.on(‘exit‘, function (worker, code, signal) { | |
console.log(‘worker ‘ + worker.process.pid + ‘ died‘); | |
}); | |
} | |
else { | |
http.createServer(function (request, response) { | |
response.writeHead(200, { ‘Content-Type‘: contentType }); | |
response.end(message); | |
}).listen(5000, ‘127.0.0.1‘); | |
} | |
console.log(‘Server running at http://127.0.0.1:5000/‘) |
Trong webserver này, Nodejs sẽ tạo ra một cluster bao gồm 1 số các process con trùng với số nhân CPU của bạn. Mục đích là để Nodejs có thể tận dụng hết được các nhân CPU (do mặc định Nodejs chỉ có thể hoạt động trên 1 thread).
.NET webserver được viết như sau:
using System; | |
using Microsoft.AspNetCore.Hosting; | |
using Microsoft.AspNetCore.Http; | |
namespace ConsoleApplication | |
{ | |
public static class Program | |
{ | |
const string Message = “Hello world!“; | |
const string ContentType = “text/plain“; | |
public static void Main(String[] args) | |
{ | |
var host = new WebHostBuilder() | |
.UseKestrel() | |
.UseUrls(“http://*:5000“) | |
.Configure(app => | |
{ | |
app.Use(d => async c => | |
{ | |
c.Response.Headers[“Content-Type“] = ContentType; | |
await c.Response.WriteAsync(Message); | |
}); | |
}) | |
.Build(); | |
host.Run(); | |
} | |
} | |
} |
Webserver được sử dụng trong benchmark này là Kestrel được viết bằng C#. Điều thú vị ở bài test này là Kestrel và httpServer của Nodejs sử dụng chung một thư viện networking có tên là libuv. Điều này sẽ cho chúng ta sự so sánh chính xác hơn về hiệu năng giữa 2 platform.
Bạn có thể thấy là bài đo của chúng ta khá đơn giản, webserver chỉ trả về “Hello world” mà thôi. Mục đích của bài đo này là kiểm tra khả năng xử lý nhiều request, do đó chúng ta chỉ nên tập trung vào tình huống đơn giản nhất
Câu lệnh mà mình thưc hiện đo là:
./wrk -t4 -c100 -d20s http://localhost:5000/
Câu lệnh này sẽ gửi liên tục các request đến webserver trong khoảng thời gian 20s (-d20s), sử dụng 4 threads (-t4) và giữ tối đa là 100 connections (-c100). Kết quả như sau:
Kestrel, .NET Core 1.0.0 : 291747 request/ giây
httpServer, Nodejs 6.3.1: 104796 request/ giây
Bạn có thể thấy rằng .NET xử lý được lượng request gấp hơn 2.5 lần so với Nodejs.
Nếu như bạn vẫn chưa thoả mãn với những phép đo này thì bạn có thể tham khảo những phép đo có hệ thống hơn tại TechEmpower benchmark. Nếu như trước giờ bạn là một trong số những người cho rằng “Nodejs cực kì nhanh”, bạn có thể sẽ ngạc nhiên với xếp hạng của Node ở trong những bài đo này
Nhầm lẫn 1: Nodejs nhanh do chạy bởi engine Google V8
Vậy tại sao Nodejs không nhanh (như bạn tưởng)?Trở lại bài viết phía đầu bài khi người viết cho rằng V8 là một trong những lý do khiến Nodejs nhanh (V8 là javascript engine của Google chrome).
Bỏ qua việc V8 chưa hẳn đã là Engine javascript nhanh nhất, có một điều chúng ta phải công nhận là v8 là một engine JS có hiệu năng tốt. Tuy nhiên một Engine Javascript tốt thì vẫn chỉ là 1 engine javascript, và hiệu năng của nó luôn bị giới hạn bởi đặc trưng của ngôn ngữ. Một ví dụ đơn giản nhất là cách javascript lưu trữ dữ liệu trong các object. Trong javascript, mỗi object lưu và đọc dữ liệu của mình bằng một bảng “Hash” chứ không lưu trực tiếp giá trị như Java, hay C#. Bạn hoàn toàn có thể làm một phép thử đơn giản:
var person = { | |
name: “Foo“, | |
age: 30 | |
}; | |
console.log(person.name === person[“name“]); //true | |
console.log(person.age === person[“age“]); //true |
Điều này có nghĩa là mỗi lần lưu (hay đọc) dữ liệu từ object, thay vì truy cập trực tiếp, Javascript phải tiến hành “hash” tên của trường cần truy cập. Cách lưu dữ liệu này rất phổ biến trong các ngôn ngữ sử dụng dynamic typing (Python, Ruby…), và Google v8 thực sự cho thấy hiệu năng vượt trội ( như chúng ta thấy trong bài test CombSort ở phần 1). Tuy nhiên, so với các ngôn ngữ sử dụng static typings (Java, C#, Go…) thì javascript khó có thể so bằng được. (lưu ý: mình nói khó, không phải “không thể”)
Nhầm lẫn 2: Nodejs chạy nhanh do có Single-threaded, Non-blocking I/O, Event loop … blah blah…
– Cho rằng Non-blocking i/o là lý do khiến Nodejs nhanh là hoàn toàn sai lầm. Lý do? Non blocking i/o là thứ có trên hầu hết(nếu như không muốn nói là tất cả) các platform/ framework hiện đại. Những ứng dụng Java sử dụng Future interface, .NET với TPL (Task parralel library), hay Python sử dụng IO loop (như trong Tornado framework) đều có thể thực hiện Non-blocking I/O như Nodejs. Trên thực tế, nếu bạn là lập trình viên .NET sử dụng TPL với async/await, bạn có thể viết các ứng dụng non-blocking mà không cần phải “callback” như trong nodejs. Async/await cũng đang là tính năng được dự trù trong ES7.Đối với Nodejs, sự khác biệt duy nhất là nonblocking i/o trở thành ý tưởng chủ đạo trong việc lập trình.
Mình cũng không rõ tại sao người viết bài viết trên lại cho rằng Nginx là “1 single-threaded webserver”. Cách sử dụng process của Nginx được viết rất rõ tại trang chủ: “ NGINX has a master process (which performs the privileged operations such as reading configuration and binding to ports) and a number of worker and helper processes.” . Điều này có nghĩa là Nginx sử dụng 1 process “cha” và nhiều process “con”, dẫn đến việc chắc chắn nó sẽ sử dụng nhiều hơn 1 thread ( mặc dù mỗi process “con” là single-threaded).
Nếu Nodejs không nhanh (như bạn tưởng), vậy bạn có nên đầu tư sử dụng nó hay không
- Phần mềm quản lý cho thuê xe ô tô thường có những tính năng gì?
- Hệ thống chấm công từ xa thông minh qua vệ tinh STracking
- Ứng dụng quản lý vận tải trên smartphone
- SGO Giải pháp thông minh cho các công ty vận chuyển, logistics thuê ngoài
- Tính năng cơ bản của một hệ thống giám sát hành trình, hộp đen và ứng dụng điều hành trong vận tải
- Lời giải cho xe trống chiều về – vấn đề nan giải của ngành vận tải Việt Nam
- Quản lý phương tiện cá nhân trên smartphone
- Ứng dụng quản lý garage trên smartphone và tablet
- Tra cứu tàu biển
- Hệ thống điều hành, tìm gọi và quản lý xe sử dụng công nghệ mới
- Phần mềm quản lý xe thường có những tính năng gì?
- Quản lý giao vận thông minh
- Giao vận, Logistic
- Hệ thống quản lý vận tải ( S-TMS ) thông minh
- Tra cứu thông tin tàu thuyền, lịch xuất cảng của từng tàu
- Phân hệ Quản lý Đội xe (Fleet Management) trong một hệ thống ERP thường có gì?
- Bán vé máy bay thông qua smartphone và tablet, smart TV
- Tra cứu thông tin đăng kiểm cơ giới
- Điều hành hãng xe công nghệ, ứng dụng đặt xe trên smartphone tương tự Uber, Grab,...
- Phần mềm CRM (phần mềm quản lý khách hàng) cho lĩnh vực vận tải, hậu cần thường gồm những gì?
- Mua vé xe, đặt vé xe trên smartphone, smart TV
DVMS chuyên:
- Tư vấn, xây dựng, chuyển giao công nghệ Blockchain, mạng xã hội,...
- Tư vấn ứng dụng cho smartphone và máy tính bảng, tư vấn ứng dụng vận tải thông minh, thực tế ảo, game mobile,...
- Tư vấn các hệ thống theo mô hình kinh tế chia sẻ như Uber, Grab, ứng dụng giúp việc,...
- Xây dựng các giải pháp quản lý vận tải, quản lý xe công vụ, quản lý xe doanh nghiệp, phần mềm và ứng dụng logistics, kho vận, vé xe điện tử,...
- Tư vấn và xây dựng mạng xã hội, tư vấn giải pháp CNTT cho doanh nghiệp, startup,...
Vì sao chọn DVMS?
- DVMS nắm vững nhiều công nghệ phần mềm, mạng và viễn thông. Như Payment gateway, SMS gateway, GIS, VOIP, iOS, Android, Blackberry, Windows Phone, cloud computing,…
- DVMS có kinh nghiệm triển khai các hệ thống trên các nền tảng điện toán đám mây nổi tiếng như Google, Amazon, Microsoft,…
- DVMS có kinh nghiệm thực tế tư vấn, xây dựng, triển khai, chuyển giao, gia công các giải pháp phần mềm cho khách hàng Việt Nam, USA, Singapore, Germany, France, các tập đoàn của nước ngoài tại Việt Nam,…
Quý khách xem Hồ sơ năng lực của DVMS tại đây >>
Quý khách gửi yêu cầu tư vấn và báo giá tại đây >>