Trong bài viết trước, chúng ta đã trải qua các trường hợp làm ảnh hưởng trực tiếp đến hiệu năng, các trường hợp khiến EventLoop trở thành viên ngọc thông chưa bao giờ được tỏa sáng. Nếu bạn chưa xem qua phần đầu tiên, có thể quay lại bài viết NodeJS có thực sự nhanh như bạn nghĩ để tránh bị chặn EventLoop sẽ nguy hiểm như thế nào nhé Quay lại chủ đề hôm nay, đó là câu chuyện giữa Anh chàng NodeJS và Cô nàng V8. Wow, nghe có vẻ ông tác này như mới yêu đấy nhỉ 😇. Không đâu, hãy tin tôi đi với những phép tu từ trong ngữ pháp tiếng việt này sẽ giúp bạn hiểu sâu hơn và nhớ lâu hơn với những khái niệm mang tính chất hàn lâm như các bạn đang gặp phải Ăn quả ghi nhớ cây trồngNodeJS vốn được biết đến là Nền tảng và được điều hành bởi V8 Javascript (được viết bằng C/C++). Và công việc quản lý và cấp phát vùng nhớ cho các ứng dụng sẽ được đảm nhiệm bởi V8 (thực ra ông này cũng tận dụng mô hình tương đồng Java Virtual Machine-JVM) Điều này đồng nghĩa với việc Công Phượng thi đấu dưới dạng cho mượn ở CLB TPHCM, nhưng mọi sự quản lý và phân bổ từ cầu thủ xứ Nghệ vẫn được đảm nhận bởi HAGL. Nói lại bản ghi V8 Engine đảm bảo nhận vai trò quản lý và cấp phát Bộ nhớ cho các ứng dụng NodeJS (100% Javascript). Vì vậy, bất kỳ vấn đề gì liên quan đến Bộ nhớ, thì bản gốc vẫn xuất phát từ V8 😅 Bingo, vẫn dễ hiểu đúng không nào. Đây không phải là 1 bài viết đi sâu vào V8, chúng ta chỉ dừng lại ở mức cơ bản của V8, và phần còn lại cần tập trung vào NodeJS trong quá trình cấu hình các ảnh hưởng từ V8 lên NodeJS tu luyệnĐể kiểm tra lại thông tin Bộ nhớ đang sử dụng, chúng ta có thể kiểm tra qua đoạn mã sau
Vì ở mỗi phiên bản NodeJS khác nhau sẽ có bộ nhớ được cấp phát khác nhau, ở phiên bản NodeJS v. 12. x đang có cấu hình mặc định là ~2GB ‘Total heap size’ ở trên chính là heapTotal, là Bộ nhớ tối đa được cấp phát cho ứng dụng NodeJS, vì vậy câu hỏi đặt ra là. Chúng ta có nên thay đổi cấu hình mặc định? Heap Memory V8 bao gồm 2 thành phần chính. NewSpace và OldSpace
Tới đây mình đã rất phân vân, không biết có nên để những phần lý thuyết trên diễn ra trong bài viết mình hay không. Nhưng tóm tắt bạn chỉ cần quan tâm đến việc lưu ý từ bộ nhớ Heap Memory V8, như sau NewSpaceOldSpaceScavenger GC (bộ thu hồi rác #Lao-Công-A)Mark-Sweep GC (bộ thu hồi rác #Lao-Công-B)#Lao-Công-A– Lau nhiều lần trong ngày(1 khoảng thời gian nào để đo lường) – Lau nhanh#Lao-Công-B – Lau with tần suất ít hơn #A – Lâu Chậm Xuống núi kinhVậy Rác(Rác) ở đây là gì, Dự án chúng ta đang tồn tại ở nơi rác mà bài viết đang đề cập?
Bingo, bạn không nhầm đâu, trên là 1 ví dụ mà mình nghĩ là đa số AE thấy nó rất bình thường, nhưng đó là vấn đề rất đáng để quan tâm khi mỗi yêu cầu Heap sẽ cấp một vùng nhớ mới để lưu trữ và đối Giải pháp ở đây, chúng ta chỉ cần xóa đối tượng và trong javascript chúng ta có thể xóa đơn giản như sau
Hoặc hạn chế bộ đệm hoặc sử dụng các biến toàn cầu mà không kiểm soát chặt chẽ Quay lại câu chuyện #2-Anh-Lão-Công. NodeJS cấp phát 64 MB cho NewSpace(mặc định), nhưng với Scavenge GC, chỉ một nửa 64 MB được sử dụng (= 32 MB). Như vậy, trong một khoảng thời gian dài phát triển, các ứng dụng của chúng ta sẽ trở nên lớn hơn và số lượng các đối tượng trong chương trình tăng dần dẫn đến ngưỡng kích hoạt GC Vì vậy, giải pháp ở đây chính là tăng giới hạn bộ nhớ cho NewSpace và rất có thể NodeJS cũng đã hỗ trợ cờ. ‘–max-semi-space-size’ để giúp chúng ta linh hoạt cấu hình dễ dàng, bạn cũng có thể theo dõi thêm danh sách cờ V8 mà Node hỗ trợ tại đây
Tại sao là 128 MB mà không phải là 1 số lượng lớn hơn, nếu nửa không gian càng lớn thì ứng dụng sẽ có hiệu suất tốt hơn? ‘Số lượng diễn ra GC giảm khi ta tăng bộ nhớ lên (64MB mặc định -> 128MB), nhưng thời gian trễ của từng GC cũng tăng lên. ’ Đến đây, chúng ta có thể trả lời cho những câu hỏi mà ta đã đặt ra ở đầu bài
Tương tự như phần NewSpace, tại vùng OldSpace(Old Generation) cũng có thể điều chỉnh qua cờ. ‘–max_old_space_size’, Tiếp tục với các bước làm trên, bạn có thể điều chỉnh để ứng dụng được xử lý tốt trong phần Bộ nhớ cho ứng dụng Như mục trên mình đã đề cập, OldSpace là vùng chứa các đối tượng và nơi không có khoảng thời gian lưu trữ lớn nhất trong Heap V8, nên khi cấu hình bạn nên hạn chế cấu hình OldSpace quá thấp, vì nó sẽ dẫn đến lỗi bên dưới
Do đó giải pháp để xử lý lỗi là tăng bộ nhớ cho vùng OldSpace để đảm bảo việc lưu trữ các đối tượng vẫn đảm bảo
Với mình, nếu bạn sử dụng máy chủ với 2GB, bạn chỉ nên đặt OldSpace với 1. 5GB, Đây chỉ là nói về NodeJS xung quanh cấu hình V8, ngoài máy chủ của bạn còn quan tâm đến các quy trình khác. Và việc nhiều quy trình hoặc dịch vụ giống nhau trên một máy chủ sẽ dẫn đến tình trạng mất kiểm soát, và thực sự rất khó để suy diễn được nguyên nhân. Đó cũng là lý do mình đã phân chia các Service. Ứng dụng NodeJS, MongoDB, Redis, ElasticSearch, … ra trên các máy chủ khác nhau Câu chuyện giữa Anh Chàng NodeJS và Cô Nàng V8Tin tôi đi, điều này sẽ rất hiệu quả trong quá trình kiểm tra giám sát tài nguyên của máy chủ. Tới đây vẫn mong AE còn đủ tỉnh táo để……………. Upvote cho mình đấy mà. Hi vọng ACE có thêm vài góc nhìn và lưu ý cho những dự án sắp tới của mình Nguồn. https. //viblo. asia/p/noi-dep-nhat-chinh-la-noi-phu-hop-nhat-va-cau-chuyen-giua-anh-chang-nodejs-va-co-nang-v8-4dbZNNOLZYM |