Bộ nhớ không được giải phóng tích tụ dần, vài ngày sau dẫn tới GC chạy dồn dập, swap hoặc tiến trình bị buộc kết thúc.
Vì sao Dữ liệu của nhân vật đã thoát game và các event handler không được giải phóng → Dẫn đến Bộ nhớ trống giảm dần qua nhiều ngày → Trên màn hình Ngay sau bảo trì thì bình thường, càng ngày càng lag, cuối cùng server sập
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng server (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Phân tích heap dump, test tải trong thời gian dài.
Việc cần làm (Đội hạ tầng)
Giám sát và cảnh báo xu hướng mức dùng bộ nhớ của từng tiến trình.
Trên đồ thị
Tăng dần · Bộ nhớ tiến trình (RSS), heap ngay sau GC
Chỗ cần xem
Xem bộ nhớ của tiến trình server game (RSS trong pidstat -r) theo đơn vị nhiều ngày; server có GC thì xem heap còn lại ngay sau GC. Java: giá trị sau GC trong cặp mức dùng trước và sau GC ở dòng -Xlog:gc; .NET: kích thước heap sau GC trong dotnet-counters (.NET 9 trở đi là dotnet.gc.last_collection.heap.size, 8 trở xuống là GC Heap Size)
Đúng nếu
heap còn lại ngay sau GC (đường đáy) tăng lên mỗi ngày kể từ lần khởi động lại, kể cả lúc rạng sáng ít người cũng không giảm xuống
Loại trừ nếu
đường đáy của heap đi ngang mà chỉ RSS tăng → phân mảnh (mem-fragment) hoặc bộ nhớ native. Lên xuống theo số người → mức dùng bình thường
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
Nếu server được khởi động lại hằng tuần trong đợt bảo trì định kỳ, rò rỉ bị che đi nên rất lâu mới bị phát hiện. Nhiều khi nó chỉ đột ngột lộ ra khi một đợt bảo trì bị lùi lại, hoặc khi sự kiện làm số người chơi tăng lên.
Nguồn
Troubleshoot Memory LeaksOracle Chương trình chạy chậm dần thì nghi rò rỉ, cuối cùng hết bộ nhớ và kết thúc bất thường. Dữ liệu cốt lõi để phân tích rò rỉ là heap dump
Debug a memory leak in .NET.NET Dù có GC, nếu cứ tham chiếu mãi đối tượng không còn cần thì vẫn rò rỉ, gây giảm hiệu năng và OutOfMemoryException. Xem xu hướng bộ nhớ và phân tích dump