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
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.
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
Concepts overviewLinux 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
Solidigm™ D7-P5520 and D7-P5620 Product BriefSolidigm Độ 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
vmstat(8) — Linux manual pageprocps-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
PSI - Pressure Stall InformationLinux 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