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

Sách trắng lag game › L11 Ổ đĩa

fsync dồn dập fsync storms

ID nguyên nhân dk-fsync · 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), Hạ tầng DB (Đội hạ tầng)

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

Mỗi yêu cầu ghi dữ liệu xuống ổ đĩa “chắc chắn” mất từ 0,1 ms đến vài chục ms tùy ổ đĩa, và khi các yêu cầu dồn lại thì hàng đợi dài ra.

Vì sao Lưu định kỳ và đợt đăng xuất ồ ạt làm yêu cầu ghi chắc chắn dồn lại → Dẫn đến Hàng đợi ổ đĩa dài ra → Trên màn hình Cứ đến giờ lưu là lag, đăng xuất và chuyển kênh bị chậm

Triệu chứng
Giật khựng, Trễ thao tác
Yếu tố
Ngưng trệ, Độ trễ
Ai gặp phải
Cả server
Khi nào
Theo chu kỳ đều, Khi đông ngườ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), Hạ tầng DB (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Gom các lần lưu để ghi một lượt (nhiều lần lưu chung một lần fsync), rải thời điểm lưu.
Việc cần làm (Đội hạ tầng)
Thiết bị server·OS: SSD cho server có tính năng bảo vệ khi mất điện, giám sát độ dài hàng đợi ổ đĩa và độ trễ fsync. Thiết bị DB: nếu dữ liệu được lưu vào DB thì ổ đĩa chứa log của DB cũng dùng loại SSD đó, giám sát độ trễ commit.
Con số tham khảo
Thời gian mỗi lần tùy thiết bị, nhưng đại khái khoảng 0,1 ms với SSD cho server (có tính năng bảo vệ khi mất điện), từ 1 đến vài ms với SSD thông thường, 1–2 ms với ổ đĩa cloud, từ 10 ms trở lên với HDD. Nếu một thread chờ từng lần một thì HDD không làm nổi 100 lần trong 1 giây.
Trên đồ thị
Vọt lên theo chu kỳ · Độ dài hàng đợi ổ đĩa, độ trễ flush và ghi
Chỗ cần xem
Đặt f/s, f_await của iostat -x 1 (số lần flush ổ đĩa đã xử lý và thời gian mất), w/s, aqu-sz, w_await chồng lên thời điểm lưu định kỳ và đăng xuất. Bản sysstat cũ hiển thị aqu-sz là avgqu-sz. Với ổ đĩa cloud, xem VolumeQueueLength, VolumeAvgWriteLatency của EBS
Đúng nếu
cứ đến giờ lưu hoặc đợt đăng xuất ồ ạt thì số lần flush và độ dài hàng đợi cùng vọt lên, w_await và f_await tăng gấp mấy lần bình thường. Lúc đó việc lưu và chuyển kênh bị chậm
Loại trừ nếu
hàng đợi vọt lên vào lúc không liên quan tới lưu hay đăng xuất → sao lưu, nén (dk-backup) hoặc giới hạn IOPS (dk-iops). Số lần flush không đổi mà vẫn chậm đi → cạn burst credit (dk-burst)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)

Nguồn

  1. fsync(2) — Linux manual page Linux man-pages
    fsync xả cả cache của ổ đĩa và chặn cho tới khi thiết bị báo hoàn tất
  2. Reliability (PostgreSQL Documentation) PostgreSQL
    Ổ SATA thông thường và nhiều SSD có cache ghi bị mất khi mất điện, nên muốn lưu chắc chắn thì cần cache có pin hoặc có bảo vệ nguồn
  3. 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, io2 Block Express trung bình dưới 500 µs với I/O 16 KiB
  4. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    Một lần seek HDD mất 10 ms
  5. iostat(1) — Linux manual page sysstat
    -x: f/s, f_await (số yêu cầu flush ổ đĩa đã xử lý và thời gian trung bình), w/s, w_await, aqu-sz (tên cũ là avgqu-sz)
  6. Amazon CloudWatch metrics for Amazon EBS AWS
    VolumeQueueLength (số yêu cầu đang chờ hoàn tất), VolumeAvgWriteLatency (độ trễ ghi trung bình 1 phút, instance Nitro)

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

Cùng tầng: L11 Ổ đĩa

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

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