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

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

Swap Swapping

ID nguyên nhân mem-swap · Phụ trách chính Hạ tầng server (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)

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

Khi thiếu bộ nhớ, OS đẩy một phần xuống ổ đĩa. Sau đó, mỗi lần cần dùng phần bộ nhớ ấy, server phải chờ ổ đĩa chậm hơn RAM trên 1.000 lần.

Vì sao Bộ nhớ đang dùng vượt quá RAM thực → Dẫn đến OS đẩy một phần xuống ổ đĩa, khi cần thì đọc lên lại → Trên màn hình Tick tăng vọt lên vài trăm ms, mọi người chơi trên server bị quay chậm và đứng hình

Triệu chứng
Quay chậm, Đứng hình
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 Hạ tầng server (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Đặt giới hạn trên cho mức dùng bộ nhớ của tiến trình (kích thước heap, v.v.) và kiểm tra rò rỉ.
Việc cần làm (Đội hạ tầng)
Cấu hình để server game không dùng swap, xử lý bằng cảnh báo bộ nhớ; khi tắt swap, tiến trình bị buộc kết thúc (OOM) ngay lúc thiếu bộ nhớ, nên cần chuẩn bị RAM dư dả so với mức dùng lúc cao điểm.
Con số tham khảo
Đọc RAM khoảng 100 ns, đọc lại từ SSD khoảng 100 µs (1.000 lần), ổ đĩa cloud nằm bên kia mạng khoảng 1 ms (10.000 lần), HDD 10 ms (100.000 lần).
Trên đồ thị
Tăng dần · Mức dùng swap, swap in/out
Chỗ cần xem
Đặt chồng lên thời gian xử lý tick: cột si, so của vmstat 1 (lượng đọc vào từ swap và đẩy ra swap mỗi giây), some và full trong /proc/pressure/memory (tỷ lệ thời gian bị dừng vì chờ bộ nhớ), majflt/s trong pidstat -r của tiến trình server game (page fault phải đọc từ ổ đĩa)
Đúng nếu
lúc lag, si lớn hơn 0, đồng thời majflt/s của server game và giá trị full của memory cùng tăng
Loại trừ nếu
si, so bằng 0 và áp lực bộ nhớ (PSI) cũng gần 0 → swap không phải nguyên nhân. Không có swap mà majflt/s và PSI tăng → bộ nhớ đã cạn, OS đang phải đọc lại trang code, cần ưu tiên bảo đảm đủ bộ nhớ trước
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
Server có GC phải đọc khắp heap khi thu gom, nên chỉ cần một phần heap bị swap là một lần GC có thể kéo dài tới vài giây, thậm chí vài chục giây. Khi tắt swap, tiến trình chuyển thẳng sang bị buộc kết thúc (OOM) mà không qua giai đoạn chậm dần vì swap, vì vậy phải bảo đảm bộ nhớ dư trước. Kể cả không có swap, khi bộ nhớ gần cạn, OS còn gỡ cả trang code của file thực thi khỏi bộ nhớ rồi phải đọc lại, nên cả server có thể chậm đi nghiêm trọng một thời gian trước khi tiến trình bị buộc kết thúc.

Nguồn

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    “Numbers Everyone Should Know”: truy cập bộ nhớ chính 100 ns, seek ổ đĩa 10 ms (số liệu năm 2009)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness: chi phí tương đối giữa swap và thu hồi trang file; swap là I/O ngẫu nhiên nên tốn kém
  3. Concepts overview Linux kernel
    Kernel thu hồi page cache (có bản gốc trên ổ đĩa) và các trang có thể swap; nếu vẫn thiếu thì OOM killer buộc một tiến trình kết thúc
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    Độ trễ 99,99% (four-nines latency) của SSD NVMe dùng cho server là 130 µs: căn cứ cho con số một lần đọc SSD mất khoảng 100 µs
  5. Amazon EBS General Purpose SSD volumes AWS
    Độ trễ của ổ đĩa mặc định trên cloud (gp3) ở mức một chữ số ms
  6. vmstat(8) — Linux manual page procps-ng
    si: lượng bộ nhớ đọc vào từ swap mỗi giây, so: lượng bộ nhớ đẩy ra swap mỗi giây
  7. PSI - Pressure Stall Information Linux kernel
    some (tỷ lệ thời gian một số tác vụ bị dừng) và full (tỷ lệ thời gian mọi tác vụ cùng bị dừng) trong /proc/pressure/memory
  8. pidstat(1) — Linux manual page sysstat
    -r: majflt/s (số page fault phải đọc trang từ ổ đĩa)

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