Sử dụng Clinic.js để tối ưu hoá hiệu suất cho ứng dụng Node.js

Sử dụng Clinic.js để tối ưu hoá hiệu suất cho ứng dụng Node.js

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Hẳn là nhiều người ở đây đã nghe đến kiểu tấn công bảo mật Clickjacking rồi nhỉ. Kẻ tấn công thường nhúng một website (thường là mục tiêu) vào trong một iframe trên website của chúng, sau đó làm mờ hoặc ẩn nó đi rồi đặt vào vị trí các nút bấm trên web, ví dụ "Bấm vào để nhận quà". Đâu ai ngờ rằng phía trên nút bấm đó là một nút bấm khác trong iframe. Khá nguy hiểm!

    Nhưng trình duyệt đã có cách ngăn chặn kiểu tấn công này bằng các quy tắc như tiêu đề X-Frame-Options, frame-ancestors của CSP và SameSite: Lax/Strict của Cookies...

    Mới đây, đã xuất hiện thêm kiểu tấn công mới - "DoubleClickjacking" 😨. Đại ý là "hắn" lợi dụng hành động double click để lừa người dùng bấm vào một nút mà hắn muốn. Chi tiết hơn trong bài viết này: DoubleClickjacking: A New Era of UI Redressing.

    » Xem thêm
  • Mọi người đã nghe nói đến Jujutsu - jj - một dạng quản lý phiên bản cho mã nguồn (version control system) chưa? Có vẻ như nó đang nhận được nhiều sự quan tâm.

    Chờ xíu! Chẳng phải git đã quá tốt rồi sao? Thế thì chế ra thằng jj để làm gì nữa? Cũng hơi khó trả lời nhỉ? Mỗi công cụ sinh ra chắc chắn phải cải thiện hoặc khắc phục được nhược điểm của cái trước. Cho nên jj ắt hẳn phải làm được điều gì đó mà git chưa làm được nên mới nổi lên như vậy.

    Thật ra mình đã nghe nói đến jj từ vài tháng trước rồi, nhưng vào đọc thì toàn kiến thức cao siêu. Hoặc là đang mang nặng cái lối suy nghĩ của git vào trong đầu rồi nên chưa lĩnh hội ra được điều gì cả.

    Mình hay có kiểu cái gì đọc lần 1 mà không hiểu thì đọc tiếp lần 2, lần 2 không hiểu thì đọc tiếp lần 3... đến lần thứ n mà vẫn không hiểu thì bỏ. Cơ mà không phải là từ bỏ mà một thời gian sau đó quay lại đọc tiếp. Đến một lúc nào đó khả năng mình sẽ hiểu ra một ít vấn đề, thế mới tài 😆.

    Thì cái jj này có vẻ như nó đang mở ra được tính linh hoạt trong việc "cam kết" mã. Tưởng tượng bạn đang làm việc trên một dự án, đang ở nhánh này, muốn sang nhánh khác để sửa, nhưng mà lại đang viết dở ở nhánh này, thế là phải stash, rồi checkout, rồi commit, rồi merge hoặc rebase lại vào nhánh cũ... nhìn chung quá trình làm việc với git nghiêm ngặt đến mức cứng nhắc, cần nhiều thao tác để giải quyết một vấn đề, chưa kể cái cây commit (commit-tree) nữa thì ôi thôi, khỏi xem cho đỡ nhức mắt. Thế nên ông jj này đang làm cách nào đó để bạn khỏi cần phải quan tâm đến các nhánh luôn, sửa trực tiếp vào commit. Nghe ảo nhỉ 😂.

    Đấy mới lĩnh hội được đến đấy, hy vọng sau n lần đọc lại nữa mình sẽ viết được một bài chi tiết hơn về công cụ này.

    » Xem thêm
  • Gòi gòi tới công chiện gòi 🤤🤤🤤

    » Xem thêm

Vấn đề

Từ khi mới bắt đầu lập trình, tôi đã bị ám ảnh về vấn đề hiệu suất của chương trình mà mình viết ra. Không biết mình viết như thế này đã tốt chưa, đã tối ưu chưa, liệu nó có thể chịu tải được bao nhiêu người dùng cùng lúc... Đó cũng là viên gạch đầu tiên đặt nền móng cho việc đi tìm hiểu sâu hơn về cách hoạt động của các ngôn ngữ lập trình nói chung, hay là Node.js nói riêng.

Trải qua nhiều năm tháng, tham gia nhiều dự án và nhận ra việc tối ưu hiệu suất không phải lúc nào cũng dễ. Có nhiều thứ cần phải quan tâm bên cạnh việc suy tư cho những dòng code. Một mặt là do tối ưu tốn khá nhiều thời gian, mặt khác là có thứ cần ưu tiên hơn là Trải nghiệm người dùng.

Tuy vậy, tối ưu hiệu suất phần mềm không bao giờ là thừa. Bạn không nên chạy đua với thời gian để tạo ra rào cản về hiệu suất bằng những đoạn mã ẩu. Mà cần dành thời gian để tìm hiểu xem những lý do nào dễ gây ra tình trạng ì ạch của phần mềm. Sau đó, tận dụng các công cụ gỡ lỗi và lập hồ sơ hiệu suất để dễ dàng cho quá trình tối ưu sau này.

Trong Node.js - Clinic.js hẳn là một cái tên không còn xa lạ với nhiều người. Đây là một công cụ mã nguồn mở giúp chuẩn đoán để điều trị các căn "bệnh" về hiệu suất dành riêng cho Node. Bài viết ngày hôm nay, chúng ta hãy xem Clinic.js có thể làm được những gì nhé.

Cải thiện hiệu suất

Clinic.js là một công cụ giúp chẩn đoán và xác định các vấn đề về hiệu suất cho các ứng dụng viết bằng Node.js. Mặc dù Clinic.js không còn được duy trì tích cực nhưng nó vẫn có nhiều tính năng hết sức mạnh mẽ để chuẩn đoán các căn bệnh thường gặp. Tài liệu của Clinic.js đã hướng dẫn rất chi tiết về cách dùng vậy nên tốt nhất bạn đọc nên tham khảo trên trang tài liệu chính thức, còn ở đây, tôi chỉ đơn giản là tổng hợp lại những gì Clinic.js có thể làm được.

Khi nói về nguyên nhân làm giảm hiệu suất thì về cơ bản là do sử dụng quá nhiều bộ nhớ, sử dụng quá nhiều CPU hoặc các vấn đề về nút thắt cổ chai. Chúng ta biết rằng máy tính chỉ gồm có số lượng tài nguyên có hạn như bộ nhớ, cpu, disk... Nếu như sử dụng hết thì chắc chắn máy tính sẽ không hoạt động được như bình thường nữa, từ đó gây ảnh hưởng đến toàn bộ hệ thống nơi phần mềm của chúng ta đang chạy. Vì thế, mấu chốt là làm sao phân bổ và sử dụng tài nguyên cho hợp lý.

Heap Profiler

Đầu tiên hãy nói về việc sử dụng bộ nhớ. Càng nhiều bộ nhớ được cấp phát, khả năng chương trình càng trở nên chậm chạp. Tưởng tượng mỗi lượt xử lý truy vấn cấp phát 1MB bộ nhớ thì 1000 truy vấn vào cùng lúc sẽ tốn bao nhiêu? Đúng vậy, là 1GB!

Đã là chương trình thì phải sử dụng bộ nhớ. Ngày nay chúng ta có rất nhiều ngôn ngữ lập trình sử dụng bộ thu gom rác tự động. Tức là rác sẽ được thu gom sau một thời gian nào đó không sử dụng. So với cấp phát thủ công có phần mất thời gian và phức tạp. Tuy nhiên điều đó chưa hẳn là tốt, nhiều khi bộ thu gom rác không thể giải phóng hết bộ nhớ thừa thãi, gây ra tình trạng rò rĩ bộ nhớ (memory leak). Phải nói rằng trong Node.js, tình trạng này xảy ra rất thường xuyên do cách phân bổ bộ nhớ của Node.js cũng như hệ thống thư viện.

Clinic.js có tính năng gọi là Heap Profiler giúp dễ dàng thống kê lại số lượng bộ nhớ được cấp phát. Từ đó giúp bạn dễ khoanh vùng vị trí nào đang sử dụng quá nhiều bộ nhớ hoặc bị "leak".

Ví dụ sau khi chạy phân tích, chúng ta nhận được một bảng thống kê như dưới đây.

Heap Profiler

Mỗi khối đại diện cho cho các lệnh gọi của một hàm. Khối nào càng lớn chứng tỏ bộ nhớ sử dụng càng nhiều. Dựa vào biểu đồ này chúng ta có thể dễ dàng tìm ra vị trí của chúng vì tất cả đều thể hiện một cách rõ ràng.

Doctor

Tiếp theo là CPU - đóng vai trò quan trọng trong tốc độ xử lý. Chúng ta đều biết Node.js chỉ có một luồng chính, nếu nó bị chặn sẽ gây ra tình trạng CPU tăng liên tục, dẫn đến nghẽn cổ chai. Nếu thấy ứng dụng phản hồi chậm hoặc chậm hơn nữa khi lượng người dùng tăng lên, khả năng là CPU đang quá cao, hoặc vòng lặp sự kiện (event loop) đang bị chặn.

Clinic.js cung cấp Doctor giúp chúng ta thống kê lại các thông số như là CPU, Memory, Event Loop... hoạt động như thế nào, có hiệu quả hay không.

Ví dụ dưới đây là kết quả sau khi chạy Doctor.

Doctor

Clinic.js ngay lập tức chỉ ra rằng vòng lặp sự kiện đang gặp vấn đề vì nó liên tục bị chặn trong vòng 300ms. Để biết tại sao lại bị chặn và bị chặn ở đâu chúng ta nên sử dụng tiếp tính năng Flame.

Flame

Qua năm tháng, nhiều tính năng được thêm vào, nhiều người tham gia vào quá trình phát triển có thể khiến cho ứng dụng trở nên "dày" hơn. Hay nói cách khác là ngày càng phức tạp hơn. Một hàm có thể được hàm khác gọi, hàm khác lại có thể được hàm khác nữa gọi... lớp này gọi lớp kia và cứ như thế nếu xảy ra vấn đề về hiệu suất, thật khó để biết chính xác vấn đề nằm ở đâu.

Flame là một tính năng cực kỳ phù hợp trong trường hợp này. Flame phân tích và hiển thị ra chính xác vấn đề nằm ở đâu, kể cả chúng có lồng nhau như thế nào đi nữa.

Ví dụ kết quả của Flame như dưới đây.

Flame

Trong đó các dòng màu trắng thể hiện cho mã do bạn viết, màu xanh là mã của thư viện trong node_modules và màu xám là mã của Node.js. Thông thường màu trắng và xanh thường chiếm nhiều thời gian xử lý nhất. Bạn sẽ dễ dàng nhận ra vị trí cần tối ưu ở màu trắng hoặc cân nhắc việc đổi thư viện nếu như màu xanh đang quá nhiều.

Bubbleprof

Cuối cùng một tính năng khá thú vị khác mà cline.js cung cấp đó chính là Bubbleprof. Nó vẽ ra một bản đồ chứa những quả bong bóng đại diện cho một nhóm các hoạt động không đồng bộ. Bong bóng càng to chứng tỏ hoạt động không đồng bộ ở đó càng lớn.

Bubbleprof

Bubbleprof được dùng để tìm ra các nút thắt cổ chai bên trong ứng dụng. Bằng cách chỉ ra thành phần nào đang chiếm quá nhiều thời gian xử lý. Bubbleprof là tính năng nâng cao vì vậy bạn nên tham khảo hướng dẫn sử dụng từ trang tài liệu.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...
Bấm hoặc cuộn mạnh để sang bài mới