한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L10 Bộ nhớ

Rò rỉ bộ nhớ Memory leak

ID nguyên nhân mem-leak · 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)

Mở thẻ gốc có hình minh họa và thí nghiệm →

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

Triệu chứng
Quay chậm, Đứng hình, Mất kết nối
Yếu tố
Ngưng trệ
Ai gặp phải
Cả server
Khi nào
Càng chạy lâu càng nặng, Giờ cao điểm buổi tối
Phụ trách
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

  1. Troubleshoot Memory Leaks Oracle
    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
  2. 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
  3. Garbage Collector Implementation Oracle
    Dòng -Xlog:gc có dạng “mức dùng trước GC->mức dùng sau GC (kích thước heap)”
  4. dotnet-counters diagnostic tool .NET
    .NET 9 trở đi hiển thị là dotnet.gc.last_collection.heap.size, .NET 8 trở xuống là GC Heap Size
  5. pidstat(1) — Linux manual page sysstat
    -r: RSS của từng tiến trình (bộ nhớ thực sự nằm trên RAM) và page fault

Nguyên nhân nên xem cùng

Cùng tầng: L10 Bộ nhớ

Nguyên nhân ở tầng khác gây cùng triệu chứng (Quay chậm)

Xem thẻ gốc có hình minh họa và thí nghiệm