Hiệu năng của nodejs



  • Theo mình được biết Nodejs chỉ chạy 1 thread duy nhất. Vậy thế éo nào mà mọi người bảo nó chạy nhanh ? Nếu nhanh thì có thể nhanh nếu chỉ có vài người truy cập.

    Tớ chỉ đang thắc mắc thui nghen. Ví dụ có cả ngàn người truy cập cùng 1 lúc mà chỉ có 1 thread xử lý thì chắc chết quá. Hay tớ đang hiểu sai 1 cái gì đó chăng ?

    Đúng k ? Ai đó làm ơn hãy thông não giúp tớ.



  • Không bạn nói đúng rồi =)). Cơ mà có một số cái nó thế này.

    Bình thướng với multitasking (Java, C#, ...) thì 1 request đi vào. thì sẽ đợi một response trả về. Lúc này thì quá trình I/O với Database level (low level) hơn code sẽ chạy. Vậy thì trong lúc đó. Sẽ không có một action nào xảy ra cả ?? Thì có phải là CPU load 0% trong quá trình đợi database không (Đá số là phức tạp O(n) ). Có thể hiểu vầy.

    request ---->
    ----> Đợi Database trả về (CPU useage 0%) ----> Response giả sử là CPU useage 0% trong 1ms
    request ---->
    ----> Đợi Database trả về (CPU useage 0%) ----> Response giả sử là CPU useage 0% trong 1ms
    .....

    Thì với 1000 request thì có phải bạn phí mất là 1000 * 1ms. Chưa kể việc multitasking ăn Ram rất khỏe cho các Core CPU hoạt động độc lập.

    Với nodejs 1 thread thì sử lí concurrency của nó thì dựa trên cơ chế của event loop thôi. (Sẽ có một event quêue đợi reponse trả về. Trong lúc đó main stack vẫn nhận thêm request để đẩy xuống eventqueue (Thực tế thì có thread pool nữa. Nhưng trong đây thì mịnh ko nói đến))

    Cơ chế của node.js sẽ là vầy

    Request -1 --->
    Request - 2 --->
    ....
    ----------------> Database trả về cho request 1 -> response
    -----------------> Database trả về cho request 2 -> response.
    .....

    Nghĩa là node.js không đơi Database trả về rồi mới cho request mới vào. Mà nó cho thẳng vào rồi assign cho 1 thread pool sau đó gọi thêm request nữa vào .... Quá trình đó diễn ra liên tục. Còn về sử dụng multi core thì ở database bạn có thể config chay multi core để tăng tốc độ xử lí của DB thôi.

    Ngoài ra còn có cluster, nginx, haproxy để bạn cho phép chạy nhiều instances node nêu bạn muốn sử dụng multi corre mà :D.

    Tuy nhiên nodejs thì không toàn năng. Nó có cơ chế concurrency rất tuyệt với với single thread. Nhưng nếu bạn chạy một thuật toán như xử lí ảnh, xử lí phức tạp hơn O(n) thì Nodejs lại không mạnh. Lúc này càn đến các tay to như C++ Java, ..... =)).
    Dù sao thì bạn nên đọc về concurrency của nodejs và các ngôn ngữ khác. Thì bạn sẽ hiểu nodejs hơn.



  • Bonus về so sánh các thuật với của NodeJS với java trên quadcore thì bạn sẽ thấy NodeJS chạy khá tệ về mặt logic code. Nên nếu mà một service xử lí ảnh iếc, abzxyz đủ thứ trên đời vote viết ra 1 server services rieeng. Node chơi với DB hoặc cái này chạy O(n) là đẹp =)))). Hybrid app server thôi.
    À mà tốc độ ra product của Nodejs còn vl hơn các ngôn ngữ khác nữa. Có khi nhanh ở đây là nhanh ra product nữa.
    https://benchmarksgame.alioth.debian.org/u64q/javascript.html



  • Em cũng đang tìm hiểu về thằng này, nhưng có 1 vấn đề em đang rất đau đầu đó là server node đang chạy vì 1 vấn đề gì đó mà bị crash ứng dụng thì ngỏm luôn cả cụm.
    Tuy rằng các module như forever, pm2... có thể khởi động lại server node khi bị lỗi nhưng có nhiều phát sinh ở phía người dùng.
    Em cũng vừa tìm hiểu, làm được 1 app tầm 200 người online thì hịu, connect tới db timeout liên tục dẫn đến server node khởi động lại liên tục -> Cpu cao liên tục từ đó phát sinh ra lỗi + giật lag rất khó chịu :(



  • Về vấn đề crash thì là mình phải coi nó lỗi logic hay gì. Cái này nên tập viết unit test để chống xảy ra.

    Còn việc bị lag giật thì hơi không hiểu lắm. Cái này chắc phải dựa trên thông tin server và source code của bạn mới đánh giá đưọc.



  • @loind db ở đây là mongodb hay mysql. Db nằm ở cùng server hay dịch vụ bên ngoài. =)). Nói chung với 200 rq mà giật là thì hơi yếu rồi.



  • Dùng mongodb và module mongoose bác ạ. Db đặt cùng sv node.



  • "server node khởi động lại liên tục " : Đoạn này nguy hiểm này. Việc connect với DB đâu có làm app crash. Mà bạn thử kiếm lại xem lí do sao lại db timeout. Hoặc bạn cho mình xem thử đoạn code kết nối DB với code làm việc DB xem.



  • @loind mình có test tạo 200 người ảo request liên tục. Kết quả là sau 1 khoảng thời gian app treo k làm gì đc nữa



  • @Huy-Ha 200 người ảo thì cỡ bn request ~~. Mình nghĩ nên đưa stress test với performance test để rõ hơn :))).



  • Nếu bạn bị crash thì cần xem logs trong pm2 hoặc 4ever


  • Banned

    LẬP TRÌNH WEB TỐC ĐỘ CAO, THỜI GIAN THỰC VỚI NODEJS
    (Tham khảo khóa học :https://goo.gl/06LnVj
    Giới thiệu khóa học
    Node.js là 1 nền tảng phát triển ứng dụng phía server. Nó sử dụng ngôn ngữ lập trình JavaScript. Mỗi kết nối đến sẽ sinh ra 1 sự kiện, cho phép hàng chục nghìn user truy cập cùng lúc và tốc độ thì cực nhanh.
    NodeJS hiện đang là 1 Javascript Engine cực hot, được nhiều người ưa chuộng bởi tốc độ nhanh, nhẹ, đơn giản và thư viện hỗ trợ phong phú.
    Vậy còn chần chờ gì nữa mà không Update xu thế!
    Khoá học "Lập trình web với NodeJS" sẽ hướng dẫn bạn từng bước để xây dựng các ứng dụng Web thời gian thực, tốc độ cao: BLOG cá nhân, CHAT nhóm,..
    Lợi ích khóa học
    Nắm được cách cài đặt NodeJS trên mọi môi trường
    Biết cách sử dụng NPM để quản lý thư viện cho ứng dụng NodeJS
    Biết cách làm việc với NodeJS và logic phía Server
    Viết được Web Server và ứng dụng Web cơ bản với NodeJS
    Xây dựng BLOG cá nhân
    Tạo được ứng dụng CHAT web
    Biết cách triển khai ứng dụng NODEJS trên Internet

    XEM NGAY TẠI : https://unica.vn/lap-trinh-web-voi-nodejs?coupon=khuyen-mai-2017


Log in to reply