Vấn đề với bộ nhớ của serverless - Deno Deploy

Vấn đề với bộ nhớ của serverless - Deno Deploy

Tin ngắn hàng ngày dành cho bạn
  • Manus đã chính thức mở cửa cho tất cả người dùng rồi đấy mọi người. Cho những ai chưa biết thì đây là một công cụ viết báo cáo (làm mưa làm gió) giống như Deep Research của OpenAI á. Mỗi ngày được miễn phí 300 Credits để nghiên cứu. Mỗi lượt nghiên cứu tiêu tốn tuỳ thuộc vào độ phức tạp của yêu cầu. À với cả họ đang có chương trình tặng miễn phí Credits hay sao á. Như mình thì vào thấy được hẳn 2000.

    Mình dùng thử, so sánh với cùng một lệnh giống như đợt trước dùng bên Deep Research thì nội dung khác biệt nhau hoàn toàn. Manus báo cáo như kiểu viết văn hơn so với OpenAI là các gạch đầu dòng và bảng biểu.

    À lúc đăng ký xong có bắt nhập số điện thoại để xác minh, nếu lỗi thì các bạn đợi qua ngày thử lại xem có được không nhé.

    » Xem thêm
  • Mọi người chắc nghe nhiều về xu hướng tìm kiếm thông tin bằng AI chứ không cần công cụ tìm kiếm như Google nữa rồi đúng không? Không đâu xa ánh xạ vào bản thân thì thấy đúng thật, thi thoảng mới tìm kiếm thôi chứ còn đâu toàn hỏi tụi AI.

    Ngay từ đầu viết blog, thứ mà mình hướng đến là chia sẻ kinh nghiệm chứ không phải là những bài mang nặng tính kỹ thuật, máy móc, hướng dẫn từ đầu... Vì thời điểm đó đã có quá nhiều người làm nội dung này rồi và họ làm rất tốt, tại sao mình phải cố phát minh lại bánh xe? Một điều nữa là tin tưởng độc giả của mình có khả năng tìm hiểu vấn đề. Nếu bạn đọc đủ nhiều các bài viết trên blog thì thấy mình luôn cố gắng chèn thêm các liên kết tham khảo ngoài bài viết, nêu ra vấn đề mở và rất ít khi kết luận chắc chắn một điều gì đó.

    Mình đã cố gắng rèn luyện kỹ năng viết, kỹ năng trình bày và cả cách tương tác với độc giả để mang lại giá trị cho họ. Nhiều lúc ngồi lật lại các con số thống kê thấy lượng đọc bài viết tăng lên lại cảm thấy vui. Nhưng khi nguồn truy cập đến từ Google thì lại thấy buồn, vì điều đó chứng tỏ họ biết đến mình chỉ khi đang cố đi tìm giải pháp, có thể họ chỉ đọc chớp nhoáng, may ra tìm được cách giải quyết và thế là đóng cửa sổ trình duyệt rồi đi như một cơn gió.

    Chừng vài tháng đổ lại đây, một điều khiến mình rất vui đó là lượng người truy cập thẳng vào trang chủ mà không thông qua công cụ tìm kiếm đang tăng dần lên, có nhiều hôm lượng truy cập tự nhiên còn cao hơn cả đến từ Google. Điều đó chứng tỏ độc giả đã có thói quen quay lại trang của mình nhiều hơn và họ tìm thấy được giá trị từ blog mang lại. Vui mừng khôn xiết 🤩

    Bên cạnh đó thì lượng truy cập vào chuyên mục Threads - tức là mục mình đang viết bài này đang cao hơn bao giờ hết. Điều đó chứng tỏ xu hướng đi theo tin nhanh là đúng đắn. Mình có thể ngồi cả ngày để viết tin ngắn cho bạn đọc vì nó rất nhanh mà tiện, không tốn công đi tìm tài liệu để viết, không tốn cả thời gian viết nữa, còn mình thì có rất nhiều thứ để chia sẻ 😅. Nhưng không vì thế mà bỏ bê các bài viết dài, vì dài thì có nhiều thông tin để chia sẻ hơn.

    Vài lời tâm sự thế thôi chứ hơn một tháng nay mình chưa viết bài viết mới nào vì công việc bận quá. Xong lâu dần cứ trì hoãn lại thành lười. À với cả tháng 5 này rất thích hợp để đọc các cuốn sách về cách mạng á. Có hôm đọc đến 2 giờ sáng mới đi ngủ 🥱

    » Xem thêm
  • Mình mới nhìn thấy một trang web khá thú vị nói về các cột mốc đáng nhớ trong lịch sử phát triển Internet toàn cầu: Internet Artifacts

    Chỉ từ 1977 - khi Internet còn nằm trong hộp thí nghiệm thì nhìn xem - giờ đây Internet đã khiến mọi thứ phát triển đến mức nào 🫣

    » Xem thêm

Vấn đề

Hà Nội đã bước vào mùa thu, thời tiết không còn nắng nóng khắc nghiệt như ngày hè nữa mà thay vào đó là những cơn mưa xen kẽ. Mưa tắc đường, ngập lụt, còn hại biết bao nhiêu người. Ghét cái tiết trời thế này thật!

Hơn nửa tháng nay cơ thể tôi khá "mềm mỏng", pha một chút uể oải và rã rời. Nó không muốn phải vận động nhiều, kéo theo đó là cả phong độ đi xuống. Nhiều hôm đi làm về chỉ muốn nằm lì một chỗ, hoặc ngủ luôn cũng được. Sáng mai thức dậy cơn đau đầu thi thoảng còn ghé đến thăm, năng suất làm việc của ngày hôm đó phải giảm đi một nửa 🫣

Cách đây không lâu, trong bài viết Đập đi xây lại có đề cập đến việc viết lại blog từ Nuxt sang Fresh để giảm thiểu mã JavaScript và tăng tốc độ tải trang. Bên cạnh đó là chuyển nhà từ Cloudflare Worker sang Deno Deploy đơn giản vì Cloudflare chưa hỗ trợ Fresh. Quá trình diễn ra suôn sẻ và nhanh chóng vì đã có kinh nghiệm triển khai dự án lên serverless từ trước đó.

Deno Deploy vẫn còn khá mới. Thi thoảng tôi nhận được báo cáo trang web bị sập từ các công cụ theo dõi. Mà điều này thì chưa từng xảy ra ở Cloudflare. Thiết nghĩ đã trên serverless rồi mà còn bị dính downtime thì quả là một điều tối kỵ. Nhưng không sao, nó không diễn ra quá thường xuyên và thường được khắc phục rất nhanh sau đó.

Gần đây, đã có một số độc giả nhắn tin trực tiếp cho tôi phản ánh về một số bài viết không thể truy cập vào được. Sau khi kiểm tra thì có vẻ như nó đã sử dụng hết bộ nhớ. Mỗi khi truy cập, màn hình logs xuất hiện một thông báo "Memory limit exceeded, terminated". Hmm... điều này trước đến nay cũng chưa từng xảy ra ở Cloudflare.

Memory limit exceeded

Như các bạn biết, serverless có cách phân bổ bộ nhớ không giống với máy chủ truyền thống. Chúng ta không thể can thiệp được vào việc cấp phát tài nguyên mà chỉ được phân bổ một lượng nhất định từ nhà cung cấp. Ví dụ mỗi một request đến thì chỉ được xử lý trong 512Kb bộ nhớ cộng với 50ms xử lý của CPU chẳng hạn. Nếu vượt quá, bạn phải trả thêm tiền để nâng cấp hoặc phải nhận thông báo lỗi giống như tôi.

Vậy thì vấn đề nằm ở logic, có thể mình đang lấy quá nhiều dữ liệu hoặc tạo ra quá nhiều biến khiến cho bộ nhớ sử dụng bị tăng lên. Nhưng có một điều lạ là không phải bài viết nào cũng bị lỗi này. Sẽ có bài bị bài không bị và điểm chung của những bài bị lỗi là nội dung thường chứa nhiều block code của markdown.

Sau khi xem xét lại mã, tôi nghĩ rằng vấn đề nằm ở hàm convertMarkdownToHTML. Hàm này có chức năng chuyển đổi văn bản markdown thành HTML để cho trình duyệt hiển thị. Các bài viết đang được để ở văn bản markdown, và với mỗi lần đọc bài viết, convertMarkdownToHTML lại được gọi.

Bên trong convertMarkdownToHTML còn có thư viện showdown-highlight để áp dụng cú pháp "tô sáng" vào những nơi có sử dụng block code. Thay vì những dòng chữ đơn điệu màu đen thì khi áp dụng highlight vào, đoạn code sẽ trở nên có màu sắc hơn. showdown-highlight áp thêm một số đoạn mã html kèm các thẻ css để thêm màu sắc. Vì thế tôi nghĩ vấn đề nằm ở đây, block code càng nhiều thì lượng ký tự thêm vào càng nhiều. Nếu cắt bớt các đoạn block code này hoặc giảm thiểu cú pháp tô sáng xuống thì nhiều khả năng sẽ giảm được dung lượng bộ nhớ.

Sau khi áp dụng với 1-2 bài thì lỗi không còn xuất hiện nữa. Tôi càng tin suy đoán của mình là đúng. Nhưng chưa kịp thở phào nhẹ nhõm thì sau khi mở Google Console, thật bất ngờ khi thấy số lượng bài viết gặp gặp lỗi nhiều hơn rất nhiều so với con số mình biết. Nếu tiếp tục áp dụng cách trên thì bài viết sẽ dần bị mất "chất". Vì loại bỏ block code đồng nghĩa với chất lượng bài viết bị giảm đi đáng kể, viết về lập trình mà không "show code" thì nói ai tin!?

Hmm, chẵng lẽ việc lấy dữ liệu từ database ra thôi mà đã hết bộ nhớ rồi sao?

Tôi thậm chí còn xem lại xem việc dữ liệu lấy dữ liệu từ database có làm tăng kích thước bộ nhớ không. Vì ngoài hàm convertMarkdownToHTML ra thì vẫn còn nhiều đoạn mã lấy bài viết gợi ý, lấy bình luận, cùng nhiều biến được tạo ra để xử lý logic... Nếu nhiều như vậy thì có lẽ nào phải ngồi cân đo đong đếm từng biến để xem chúng đang chiếm bao nhiêu bộ nhớ sao?

Một bước ngoặt lớn khi tôi phát hiện ra một bài viết rất ít chữ cũng gặp phải tình trạng tương tự. Điều đó cho thấy vấn đề không phụ thuộc vào độ dài ngắn của nội dung bài viết mà có thể là do một đoạn mã nào đó đang sử dụng bộ nhớ nhiều hơn. Như vậy, phải có cách nào đó soi được quá trình cấp phát bộ nhớ trong của Deno thì mới xác định được vấn đề nằm ở đâu.

Dev Tools trong trình duyệt có một công cụ giúp chúng ta theo dõi được lượng bộ nhớ đã được phân bổ. Mở Dev Tools, vào "Memory" và nhìn vào tuỳ chọn "Allocation sampling", nó cho phép chúng ta quan sát được bộ nhớ được cấp phát trong quá trình chạy. Thật may mắn vì Deno vẫn sử dụng V8 nên bật debug thì sẽ sử dụng được tính năng này.

Dev Tools Memory

Tôi tìm cách bật debug trong Deno. Thật đơn giản, chỉ cần thêm cờ --inspect vào trước lệnh run thì quá trình debug rất giống với Node.js.

Tại đây, sau khi soi Chart thì đúng là hàm convertMarkdownToHTML đang sử dụng rất nhiều bộ nhớ, lên đến 86% tổng bộ nhớ trong phiên xử lý này. Khi so sánh với bài viết không gặp lỗi, thì con số chỉ ở mức hơn 20% một chút. Tiếp tục soi vào bên trong convertMarkdownToHTML thì hoá ra thư viện showdown cần nhiều bộ nhớ để parse markdown sang HTML. Cuối cùng tôi có thể kết luận rằng bài viết nào sử dụng thẻ markdown càng phức tạp thì khả năng lỗi càng cao.

Phân tích hàm parse markdown

Phân tích hàm parse markdown 2

Đến đây nhiều người nghĩ nên đổi sang thư viện khác. Nhưng tôi thì ngược lại, một phần vì đã mất công cấu hình thư viện này parse một số đoạn mã phức tạp theo cách mà mình muốn. Nếu đổi sang thư viện khác thì phải tìm cách parse lại nội dung giống như thế, tốn thời gian, cả chưa kể rủi ro về việc phá vỡ parse mã trong các bài viết khác.

Vậy cách khả thi nhất vẫn là gỡ service parse markdown hiện tại ra, không gọi hàm convertMarkdownToHTML mỗi khi render bài viết nữa. Thay vào đó là tạo thêm một cột lưu lại nội dung dạng HTML trong mỗi bài viết.

Chỉ với vài dòng code, tôi tách được hàm convertMarkdownToHTML sang một project sử dụng hono.dev và triển khai nó lên Cloudflare Worker. Sau đó thêm logic ở API tạo/cập nhật bài viết, chuyển hàm convertMarkdownToHTML thành một cuộc gọi API sang service mới, lưu lại nội dung HTML mới. Đồng thời bỏ hàm convertMarkdownToHTML cũ đi.

Mọi thứ đã hoạt động trở lại!

Tổng kết

Qua vấn đề này mới thấy tài nguyên trong serverless là hữu hạn, không được sử dụng thoả thích như trong máy chủ. Cần phải cẩn trọng trong khâu xử lý dữ liệu, mọi thứ cần phải được tối ưu nhất có thể nếu không muốn gặp phải phiền toái trong quá trình vận hành.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên 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...