[Building a Super App] Workshop Sharing: "Garbage collectors and Memory Leaks in Nodejs V8"

Đăng ký ngay tại: Workshop Sharing: “Garbage collectors and Memory Leaks in Nodejs V8”


Giới thiệu

Các ngôn ngữ low-level như C cho phép quản lý bộ nhớ thủ công (thông qua “malloc” và “free”). Ngược lại, JavaScript tự động cấp phát bộ nhớ khi các đối tượng được tạo và giải phóng nó khi chúng không được sử dụng nữa (garbage collection). Tính tự động này là một nguồn tiềm ẩn của sự nhầm lẫn khiến các developer có cho rằng họ không cần quan tâm về việc quản lý bộ nhớ trong javascript.

Workshop Sharing: “Garbage collectors and Memory Leaks in Nodejs V8” sẽ giúp các bạn hiểu hơn những vấn đề đằng sau việc quản lý bộ nhớ của javascript trên cả môi trường frontend - browser hay backend - nodejs/deno qua đó có được phương pháp tối ưu phù hợp cho các project sử dụng javascript trên các server/system có giới hạn resource như Tiki Tini App. Workshop cũng bao gồm demo việc profiling memory một javascript app (node and browser) trong thực tế sẽ như thế nào và sẽ giúp mọi người cải thiện hiệu suất làm việc với các công nghệ xoay quanh ngôn ngữ này.

Nội dung cụ thể

  1. Kiến thức về js garbage collection(GC):
  • V8 Hidden class
  • V8 garbage collectors - parallel scavenging
  • So sánh V8 GC và JavascriptCore GC (Webkit)
  • best practice javascript để tối ưu GC - immutable.js
  1. Demo: Memory profiling memory các javascript apps
  • profile frontend app với facebook memlab
  • profile backend app với chrome devtools

Workshop phù hợp với các bạn đã từng sử dụng đã từng sử dụng JavaScript và/hoặc nodejs và npm. Vui lòng tìm hiểu thêm về các kiến thức này để dễ dàng kết nối với các chủ đề kiến thức trong workshop.

Thời gian

  • Vào lúc: 16h00 - 17h30
  • Ngày: 10/11/2022.

Hình thức tổ chức

Online: qua Google Meet tại meet.google.com/bxv-kcxa-fdd

Đăng ký ngay

Workshop Sharing: “Garbage collectors and Memory Leaks in Nodejs V8”

Đặt câu hỏi cho diễn giả

Nếu bạn có bất kì vướng mắc hay câu hỏi nào, hãy để lại bình luận tại bài viết này, diễn giả và đội ngũ Tini App sẽ hỗ trợ bạn. Đặc biệt, 02 khán giả có câu hỏi hay nhất sẽ nhận những phần quà hấp dẫn từ Tini App.

Ngoài ra, dưới đây là một số bài viết dành cho bạn đọc quan tâm về Tini App:


Workshop “Garbage collectors and Memory Leaks in Nodejs V8” đã kết thúc. Trên thực tế, hầu hết các developer không cần phải suy nghĩ về GC khi phát triển các chương trình JavaScript. Tuy nhiên, việc nắm rõ một số nội dung bên trong V8 compiler và GC thông qua workshop này, có thể giúp bạn hiểu hơn về việc sử dụng bộ nhớ và các pattern hữu ích. Ví dụ: với cấu trúc generations của V8 heap, các short-live object thực sự rất tốn ít tài nguyên hơn theo góc nhìn từ GC và những object tồn tại quá lâu sẽ là nguyên nhân gây chậm GC. Những pattern này hoạt động tốt cho nhiều ngôn ngữ sử dụng concept GC, không chỉ JavaScript. Từ đó các bạn có thể cải thiện hiệu năng các sản phẩm ứng dụng sử dụng JavaScript lên đáng kể.

Xin chân thành cảm ơn các bạn đã tham gia và đồng hành cùng Tini App. BTC gửi bạn slide tổng hợp thông tin và video ghi lại nội dung chia sẻ qua đường dẫn bên dưới:

Hẹn gặp lại các bạn trong các workshop tiếp theo.

7 Likes

Chào bạn,
Cảm ơn bạn chia sẻ.
Bạn có thể nói rõ hơn về issue stop-the-world trong quá trình Garbage collector để mark, sweep và compact. Các bước nào sẽ gây ra stop-the-world issue. Có sự khác nhau vào việc stop-the-world giữa minor/mirror gc running do V8 improve không bạn?

3 Likes

Mình thấy các bạn IT coder trong công ty mình dùng những máy laptop workstation để lập trình, vậy nếu sử dụng garbage collection thì những máy cơ bản có thể dùng đc ko, và có bị out of memory ko ạ? Và nếu lỡ có bị out of memory thì phương hướng xử lý như thế nào cho phù hợp?

3 Likes

Hi bạn.
Heap size bao nhiêu là hợp lý để GC xử lý dưới 200ms?
Nếu đồng thời có 1k request tới server thì nên cân nhắc tối ưu thế nào ?
Bạn đã tối ưu với GC như thế nào trong thực tế?

3 Likes

stop-the-world là “issue” nói về việc main thread của V8 cần tạm dừng để các GC hoạt động nhằm tránh xung đột deadlocks(ví dụ khi GC và main thread cùng tuy cập vào một ô nhớ). Ở các phiên bản đầu của V8 thì issue này sẽ xảy ra ở cả ba bước mark, sweep và compact.
Tuy nhiên hiện nay V8 cũng đã tối ưu bằng cách tách GC ra các helper threads, ở bước marking và sweeping, V8 không còn dừng main thread lại nữa và cho chạy concurrent so với main thread, trong khi bước compact(update pointer) sẽ được chạy parallel.
stop-the-world là đặc điểm của cả Minor GC và Major GC.


Bạn có thể đọc thêm về concept của GC ở đây : Trash talk: the Orinoco garbage collector · V8

1 Like

Heap size lớn không liên quan đến việc GC delay mà hầu hết phụ thuộc vào lượng garbage cần collect và cách app của bạn hoạt động. Ví dụ bạn có thể tăng heap lên 4GB trong khi node app của bạn chỉ có khoảng 1000 requests/ngày thì cũng không ảnh hưởng đến độ trễ khi GC hoạt động.
Còn khi tỉ lệ used memory/total heap cao thì GC mới bắt đầu tăng độ trễ phản hồi của app. Khi này V8 GC sẽ dùng Incremental => chia các vùng nhớ cần dọn dẹp thành các chunks nhỏ và chạy sen kẽ ngay với main thread để tăng response time cho main thread.

Incremental GC mode:

Về server của bạn với 1k requests per second thì vẫn chưa là con số quá lớn, với các server nhỏ thì có thể serve lên tới 10K CCU một cách bình thường. Tuy nhiên việc optimize delay time/ CCU thì lại là vấn đề khác.
Mình không biết server của bạn đang xử lí các business gì nên mình không thể nêu ra các cách optimize phù hợp. Tuy nhiên mình sẽ đưa ra 3 optimize mà mình thường dùng để tối ưu response time cho node (ngoài các vấn đề mình đã nói trong buổi sharing về GC):

  • Chỉ sử dụng node cho các các IO intensive tasks, các tác vụ cần CPU thì có thể move về worker thread, hoặc kết hợp với WASM, hoặc dùng C++ Addons của node.
  • Không serve các assets file qua node, thay vào đó dùng các proxy như nginx sẽ phù hợp hơn
  • Bạn có thể thử qua Cluster api của node để horizontal scale với single server
2 Likes

Mình đã trả lời trong workshop tuy nhiên mình sẽ note lại giúp bạn nhé.
ở node có thể config memory cho v8 bằng flag --max-old-space-size để tăng heap cho Major GC(old generation) và --max-semi-space-size để tăng heap cho Minor GC (young generation, lưu ý: như mình đã nói Minor GC chia young generation ra làm 2 phần bằng nhau nên flag này sẽ được hiểu là 1/2 của young generation memory space)
Bạn có thể xem thêm ở document của node:
https://nodejs.org/api/cli.html#–max-semi-space-sizesize-in-megabytes

1 Like

Như đã thông tin đến các bạn, 02 khán giả có câu hỏi hay nhất sẽ nhận 02 phần quà từ chương trình. Chúng ta sẽ cùng nhờ diễn giả - anh @thien.ly chọn ra khán giả may mắn trong Workshop lần này nhé.

1 Like

@Tini_Community Vậy nhờ BTC trao quà cho hai bạn @Tom_Nguyen@ledongthuc giúp mình nhé.

3 Likes

Chúc mừng @Tom_Nguyen@ledongthuc đã trở thành 02 khán giả có câu hỏi hay nhất gửi về chương trình. BTC sẽ gửi tặng bạn một phần quà đặc biệt. Bạn vui lòng gửi về địa chỉ mail hackathon@tiki.vn các thông tin cá nhân sau:

  1. Họ và tên
  2. Số điện thoại
  3. Địa chỉ nhận quà

Cảm ơn bạn đã tham gia cùng Tiki Tini App và hẹn gặp bạn ở các sự kiện tiếp theo.

*Lưu ý: Hạn chót gửi thông tin về mail hackathon@tiki.vn là vào ngày 17/11/2022. Sau thời gian trên, nếu BTC không nhận được thông tin của bạn, phần quà sẽ được chuyển cho người tham dự Workshop tiếp theo.

1 Like