nói dối e blog

Ghi Chép Nhỏ Về Hành Trình Truy Vết Rò Rỉ Bộ Nhớ

Gần đây, hệ thống máy chủ game của chúng tôi lại gặp sự cố nghiêm trọng về rò rỉ bộ nhớ. Điều đặc biệt ở đây là tốc độ rò rỉ cực kỳ chậm, khiến lỗi này ẩn giấu rất tinh vi và khó phát hiện.

Quy trình xác nhận và khắc phục bug này như sau: Vì Skynet về bản chất được điều khiển bởi một module đồng hồ duy nhất, nên trước tiên chúng tôi đã chỉnh sửa mã nguồn phần đồng hồ để hệ thống có thể chạy với tốc độ gấp 10 lần bình thường. Nhờ đó, hiện tượng vốn cần vài ngày mới phát hiện được đã được thu gọn còn nửa ngày. Điều này giúp khẳng định đây thực sự là lỗi rò rỉ bộ nhớ chứ không phải vấn đề tăng trưởng bộ nhớ do quy trình xử lý bình thường gây ra.

Liên Kết Đối Tượng C/C++ Với Lua

Dưới đây là phiên bản viết lại hoàn toàn bằng tiếng Việt, mở rộng và diễn giải lại nội dung gốc về việc bind đối tượng C/C++ với Lua:


Kỹ thuật kết nối đối tượng C/C++ với Lua

Khi phát triển ứng dụng kết hợp giữa Lua và C/C++, một trong những yêu cầu quan trọng là làm thế nào để các đối tượng C++ có thể tương tác mượt mà với môi trường Lua. Có hai phương pháp chính thường được sử dụng:

Ôn Cố Tri Tân

Lần cuối cùng tôi đọc toàn bộ mã nguồn Lua, phiên bản lúc đó còn là 5.1. Tất nhiên tôi cũng đã nghiên cứu kỹ 5.0, còn các phiên bản 4.0 và 3.2 thì chỉ lướt qua thôi. Gần đây có chút thời gian rảnh, tôi quyết định tiếp tục viết cuốn “Tìm hiểu mã nguồn Lua” của mình. Trong kế hoạch ban đầu, tôi còn thiếu khoảng 6 chương quan trọng: máy ảo, lưu trữ mã byte, API trong C, trình thông dịch, cơ chế thu gom rác và các hàm thư viện chuẩn.

Quản Lý Cảnh Trong Pixel Light

Vài ngày gần đây, tôi tình cờ phát hiện một engine 3D mã nguồn mở có tên Pixel Light. Dù tài liệu của nó không quá phong phú, nhưng cách trình bày rất chỉn chu và dễ hiểu. Tôi đã clone source code từ kho lưu trữ và dành vài ngày nghiên cứu. Càng tìm hiểu, tôi càng thấy kiến trúc của nó có nhiều điểm đáng ngưỡng mộ, đặc biệt là trong thiết kế hệ thống. Hôm nay, tôi xin chia sẻ một số cảm nhận về phần quản lý cảnh (scene management) của engine này.

Vấn Đề Kiểm Tra Lỗi Bộ Nhớ Bất Thường

Hôm nay, tôi đã tham gia một cuộc họp điện thoại nhằm hỗ trợ đối tác phân tích nguyên nhân khiến chương trình C++ do họ phát triển bị crash. Hiện tượng cụ thể như sau:

Một đối tượng C++ chứa một vector lưu trữ hàng loạt con trỏ trỏ đến các đối tượng khác. Sau khi đối tượng này được khởi tạo xong, tuyệt đối không có bất kỳ thao tác ghi đè nào – toàn bộ phương thức đều ở chế độ chỉ đọc (được đánh dấu bằng từ khóa const). Tuy nhiên, trong môi trường thoát chương trình nhất định, khi đối tượng bị hủy bỏ, hàm hủy của nó cần thực hiện xóa toàn bộ con trỏ trong vector. Lúc này phát hiện: trong vector dài khoảng hơn 100 phần tử, con trỏ ở vị trí thứ 95 luôn bị lệch. Lệch từ 1-3 byte (hiện tượng này không ổn định, xác suất lỗi thay đổi qua mỗi lần chạy).

Công Cụ Kiểm Tra Rò Rỉ Bộ Nhớ Lua

Hôm qua, chúng tôi phát hiện một vấn đề nghiêm trọng: lượng RAM của máy chủ nightly build tăng đột biến đến 8GB chỉ sau một đêm. Rõ ràng đây là một trường hợp rò rỉ bộ nhớ điển hình.

Trước đây, chúng tôi đã xây dựng sẵn nhiều giao thức gỡ lỗi trong hệ thống skynet, nhờ đó có thể nhanh chóng xác định được dịch vụ gặp lỗi - chính là trạng thái Lua của một bản đồ cụ thể. Bằng chứng cho thấy trong quá trình triển khai logic bản đồ bằng Lua, có những đối tượng đang được tạo ra liên tục. Dù tốc độ tạo không cao, nhưng do không có cơ chế giải phóng tham chiếu, lượng bộ nhớ cứ tăng dần theo thời gian.

0%