Nếu giữa tick mà phải chờ phản hồi DB hoặc ghi file, mọi diễn biến game trên server dừng lại đúng khoảng thời gian đó.
Vì sao Trong tick phải chờ truy vấn và lưu DB, ghi log, gọi API bên ngoài → Dẫn đến DB mất 100 ms thì tick cũng dừng 100 ms → Trên màn hình Mỗi lần DB hoặc ổ đĩa chậm đi, cả bản đồ lại khựng
Khi làm một thao tác nhất định, Thỉnh thoảng bất chợt
Phụ trách
Phụ trách chính Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Chuyển mọi việc chậm (truy vấn và lưu DB, ghi log, gọi API bên ngoài) sang chạy bất đồng bộ và áp kết quả ở tick sau (chỉ đặt timeout thì trong lúc chờ, tick vẫn dừng).
Con số tham khảo
Dù một lượt khứ hồi tới DB trong cùng trung tâm dữ liệu chỉ 0,5 ms, gọi 100 lần trong một tick là 50 ms. Một mình nó dùng hết budget của 20 tick.
Trên đồ thị
Thỉnh thoảng vọt lên bất chợt · Thời gian tick của server, độ trễ query DB
Chỗ cần xem
Đồ thị thời gian tick trên cùng trục thời gian với độ trễ query DB (slow query log, v.v.) và độ trễ ổ đĩa. Nếu không có chỉ số tick, dùng bcc offcputime -p xem game thread đang chờ ở đâu
Đúng nếu
thời điểm tick vọt lên trùng với lúc độ trễ DB hoặc file vọt lên, và thời gian chờ của game thread dồn vào các call stack nhận phản hồi DB hoặc ghi file
Loại trừ nếu
độ trễ DB và ổ đĩa vẫn bình thường mà tick vọt lên → GC pause hoặc tranh chấp lock
ASP.NET Core Best PracticesMicrosoft Gọi bất đồng bộ cho truy cập dữ liệu, I/O và tác vụ chạy lâu; lời gọi blocking đồng bộ dẫn đến cạn thread pool và phản hồi chậm