# Sách trắng lag game (Game Lag White Paper) > Sách trắng giải thích 228 nguyên nhân gây lag trong game online (giật khựng, dịch chuyển tức thời, kéo ngược, tua nhanh, trễ thao tác, đứng hình, mất kết nối…), chia theo 13 tầng từ màn hình của bạn đến cơ sở dữ liệu của server và 3 chủ đề (thiết kế đồng bộ, sự cố chỉ một số người gặp, truyền lại TCP). Nội dung lấy MMO làm ví dụ chính, nhưng phần lớn áp dụng cho game online nói chung, bất kể thể loại. Mỗi nguyên nhân có ba bước Vì sao → Dẫn đến → Trên màn hình, các triệu chứng liên quan, con số tham khảo, bên phụ trách xử lý (đội phát triển game, đội hạ tầng, bên ngoài) cùng việc cần làm của từng đội, dạng đồ thị và cách kiểm tra, nguồn tham khảo đáng tin cậy (RFC, tài liệu chính thức về kernel, OS, cloud, engine, DB, bài báo khoa học). Mỗi nguyên nhân được gọi bằng ID (ví dụ: mem-gc) và có trang riêng (ví dụ: https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-gc.html). Các con số là giá trị tiêu biểu trong môi trường vận hành thông thường; giá trị mặc định và phiên bản đều có căn cứ trong phần nguồn của từng trang nguyên nhân. Khi trích dẫn, hãy dùng địa chỉ trang nguyên nhân. Giấy phép MIT. Bản gốc viết bằng tiếng Hàn, bản này là bản dịch: https://jungrok5.github.io/mmo-lag-anatomy/ ## Tài liệu - [Toàn bộ nội dung (Markdown)](https://jungrok5.github.io/mmo-lag-anatomy/vi/llms-full.txt): Toàn bộ nguyên nhân, triệu chứng, phụ trách, thuật ngữ và nguồn trong một tệp - [Phiên bản văn bản](https://jungrok5.github.io/mmo-lag-anatomy/vi/text.html): Trang HTML đọc toàn bộ nội dung trên một trang, không cần JavaScript - [Sách trắng lag game](https://jungrok5.github.io/mmo-lag-anatomy/vi/): Bản gốc có hình minh họa và thí nghiệm tương tác ## Nguyên nhân theo triệu chứng - [Giật khựng](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/stutter.html): 60 nguyên nhân. Chuyển động không mượt, cứ khựng lại một chút rồi chạy tiếp, lặp đi lặp lại. - [Dịch chuyển tức thời](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/teleport.html): 47 nguyên nhân. Nhân vật nhảy thẳng tới một vị trí ở xa mà không thấy quá trình di chuyển. - [Kéo ngược](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/rubber.html): 14 nguyên nhân. Nhân vật của bạn đang đi tới thì bị kéo về chỗ vừa đi qua. - [Tua nhanh](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/burst.html): 36 nguyên nhân. Màn hình đang đứng bỗng chạy lại, và mọi chuyển động, đòn đánh, sát thương bị dồn lại trôi qua thật nhanh cùng một lúc. - [Quay chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/slowmo.html): 24 nguyên nhân. Mọi thứ chuyển động chậm. Việc tung skill và quái di chuyển trông như bị kéo dài ra. Tùy thiết kế server, tốc độ có thể vẫn giữ nguyên nhưng hiện ra thành giật khựng hoặc dịch chuyển tức thời. - [Trễ thao tác](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/delay.html): 76 nguyên nhân. Từ lúc bấm đến lúc thấy kết quả mất một khoảng thời gian. Bản thân màn hình có thể vẫn mượt. - [Đứng hình](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/freeze.html): 67 nguyên nhân. Mọi thứ trên màn hình dừng lại một lúc (0,5 giây đến vài giây) rồi chạy tiếp. - [Nuốt thao tác·rollback](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/dropped.html): 36 nguyên nhân. Hành động rõ ràng đã làm lại bị coi như chưa từng xảy ra, hoặc kết quả bị đảo ngược một lúc lâu sau. - [Mất kết nối](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/disconnect.html): 51 nguyên nhân. Đang chơi thì kết nối bị ngắt, game quay về màn hình đăng nhập hoặc cửa sổ kết nối lại. - [Không vào được·kẹt loading](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/noconnect.html): 45 nguyên nhân. Không vào được game, hoặc bị kẹt ở màn hình loading hay màn hình vào game. - [Không hiển thị·đối tượng ma](https://jungrok5.github.io/mmo-lag-anatomy/vi/s/invisible.html): 20 nguyên nhân. NPC, quái hay người chơi lẽ ra phải có thì chỉ riêng màn hình của bạn không có, hoặc đối tượng đã biến mất vẫn còn trên màn hình của riêng bạn. ## L1 Tiến trình game phía client - [Frame time vọt lên](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-hitch.html): Việc tính toán một khung hình mất thời gian gấp nhiều lần bình thường nên màn hình dừng lại trong chốc lát. - [Thu gom rác (GC) phía client](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-gc.html): Trong lúc thu hồi bộ nhớ đã dùng xong (rác), cả game dừng lại. Đặc trưng là giật khựng theo khoảng cách đều đặn. - [Tải đồng bộ trên main thread và biên dịch shader](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-sync-load.html): Ngay trước khi vẽ khu vực, quái hay hiệu ứng lần đầu xuất hiện, game phải đọc file và tạo shader nên bị dừng. - [Ổ lưu trữ chậm khiến streaming asset không theo kịp](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-asset-stream.html): Trên ổ lưu trữ chậm như HDD, tốc độ đọc texture và model của thế giới mở không theo kịp tốc độ di chuyển, nên đối tượng hiện ra muộn hoặc game giật vì phải chờ đọc xong. - [Tải render khi đông người](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-crowd.html): Khi hàng trăm người cùng hiện trên một màn hình như lúc công thành hay đánh world boss, riêng chi phí vẽ đã vượt quá sức máy. - [Nghẽn xử lý gói tin trên main thread](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-net-mainthread.html): Nếu mỗi khung hình chỉ xử lý một lượng gói tin cố định, số gói dồn tới sẽ liên tục bị đẩy sang khung hình sau. - [Bộ đệm nội suy không có hoặc quá ngắn](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-no-buffer.html): Nếu vẽ ngay khi nhận gói tin từ server, jitter (độ dao động của khoảng cách giữa các lần gói tin đến) lộ nguyên trên màn hình. - [Ngoại suy quá mức (dead reckoning)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-extrap.html): Trong lúc không có gói tin, client cho đối tượng tiếp tục di chuyển theo vận tốc cuối cùng, rồi khi biết là sai thì kéo lại. - [Dự đoán phía client sai lệch](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-predict.html): Client của bạn đã cho nhân vật di chuyển trước, nhưng nếu server tính ra kết quả khác thì nhân vật của bạn bị kéo đi. - [Fixed timestep chạy bù mất kiểm soát](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-fixed-step.html): Sau một lần dừng, game dồn phần tính toán bị tồn lại để chạy bù, và chính phần tính toán đó lại làm game chậm tiếp. - [Sai lệch đồng bộ đồng hồ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-clock.html): Nếu giờ server mà client ước tính bị sai, thời điểm nội suy và việc phán định hồi chiêu sẽ lệch. - [Mất độ chính xác thời gian kiểu float](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-float-time.html): Nếu game lưu thời gian bằng kiểu số thực độ chính xác thấp (float), game bật càng lâu thì độ phân giải thời gian (khoảng chênh nhỏ nhất còn phân biệt được) càng kém, khiến chuyển động và hiệu ứng bị rung. - [V-Sync và hàng đợi render](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-vsync.html): GPU xếp vài khung hình đã vẽ vào hàng đợi rồi mới đẩy ra theo chu kỳ của màn hình, và trong lúc đó thao tác bị trễ. - [Rò rỉ bộ nhớ phía client](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-leak.html): Game bật càng lâu thì bộ nhớ dùng càng tăng, game chậm dần rồi cuối cùng bị tắt cưỡng bức. - [Client bị crash](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-crash.html): Game tắt vì một lỗi không được xử lý. Người chơi thấy giống mất kết nối, nhưng server vẫn bình thường. - [Kiểm tra của module bảo mật game (anti-cheat)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/cg-anticheat.html): Module bảo mật chạy cùng game để chống hack sẽ kiểm tra định kỳ. Nếu lần kiểm tra nặng, hoặc heartbeat (tín hiệu định kỳ báo vẫn còn sống) trao đổi với server bảo mật bị trễ, game sẽ giật khựng hoặc mất kết nối. ## L2 OS và thiết bị phía client - [Tiến trình chạy nền chiếm giữ CPU](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-background.html): Khi việc quét virus, Windows Update, phần mềm livestream hay video trên trình duyệt chiếm các core, game thread không được cấp CPU và phải chờ. - [Chế độ tiết kiệm điện và bóp xung do nhiệt](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-power.html): Chế độ pin của laptop, chế độ tiết kiệm pin của điện thoại hay máy nóng lên đều làm tốc độ CPU, GPU giảm. Đặc trưng của quá nhiệt là lúc đầu vẫn ổn, chơi một lúc lâu mới bắt đầu chậm. - [Độ phân giải timer](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-timer.html): Timer mặc định của Windows có bước 15,6 ms, nên lệnh “chỉ nghỉ 1 ms” thực tế kéo dài tới chu kỳ timer kế tiếp, lâu nhất tới 15,6 ms. - [Ứng dụng di động chuyển xuống chạy nền](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-mobile-bg.html): Khi bạn tạm chuyển ra khỏi game để xem thông báo, vài giây sau OS tạm dừng (suspend) ứng dụng, và trong lúc đó server ngắt kết nối của bạn. - [Chuyển đổi Wi-Fi ↔ LTE hoặc 5G](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-netswitch.html): Khi bạn ra khỏi nhà, Wi-Fi mất và máy chuyển sang LTE hoặc 5G, địa chỉ IP của bạn thay đổi nên kết nối hiện có không còn dùng được. - [Phần mềm bảo mật kiểm tra gói tin](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-security.html): Khi phần mềm diệt virus hay tường lửa kiểm tra mọi gói tin, độ trễ tăng lên; nếu quá tay, chúng còn nhầm game là tấn công và chặn lại. - [Tràn bộ đệm nhận](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-rcvbuf.html): Khi game bận và lấy gói tin ra khỏi socket (giao diện gửi nhận qua mạng do OS cung cấp) chậm, bộ đệm của OS bị tràn. - [Thiếu bộ nhớ và swap phía client](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-swap.html): Khi mở vài chục tab trình duyệt cùng lúc với game, OS đẩy một phần bộ nhớ của game xuống ổ đĩa. - [Thiếu bộ nhớ đồ họa (VRAM)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-vram.html): Nếu tùy chọn đồ họa cần nhiều bộ nhớ hơn bộ nhớ của card đồ họa, OS phải đẩy texture ra bộ nhớ của PC rồi lấy lại, gây giật khựng. - [Wi-Fi quét nền](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-wifi-scan.html): OS định kỳ chuyển qua các kênh để dò Wi-Fi xung quanh, và trong lúc đó việc truyền dữ liệu tạm dừng. - [Tiết kiệm điện NIC và lỗi driver](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-driver.html): Nếu card mạng LAN hoặc chip Wi-Fi vào trạng thái tiết kiệm điện giữa các gói tin, việc kích hoạt lại sẽ tốn thời gian. - [Ứng dụng khác trên cùng thiết bị chiếm giữ băng thông](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-other-apps.html): Khi đồng bộ cloud, tải file dung lượng lớn hay tải bản cập nhật game chạy trên cùng PC, gói tin của game phải chờ trong hàng đợi. - [Giới hạn xử lý khi cửa sổ bị thu nhỏ hoặc mất focus](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-unfocused.html): Khi bạn chuyển sang cửa sổ khác hoặc thu nhỏ game, cả game lẫn Windows đều cho game chạy chậm lại để tiết kiệm điện. Lúc quay lại, gói tin tồn đọng dồn tới một lượt, hoặc kết nối đã bị ngắt. - [Phần mềm overlay can thiệp vào game](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-overlay.html): Phần mềm nhắn tin, launcher, quay màn hình, hiển thị FPS chen vào quá trình render của game (hooking) để vẽ UI của chúng đè lên màn hình game. Mỗi khung hình phải làm thêm việc, và đôi khi xung đột với game gây khựng hoặc làm game bị tắt đột ngột. - [Độ trễ của màn hình, thiết bị nhập và tạo khung hình](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/co-display-input.html): Nếu ping bình thường mà điều khiển vẫn thấy nặng, có thể phần xử lý hình ảnh của TV, tay cầm không dây hoặc tính năng tạo khung hình đang cộng thêm độ trễ giữa thao tác và màn hình. ## L3 Mạng gia đình - [Nhiễu và sóng Wi-Fi yếu](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-wifi.html): Khi sóng yếu hoặc bị nhiễu, đoạn không dây phải gửi lại nhiều lần nên thời điểm gói tin đến lúc nhanh lúc chậm. - [Kênh Wi-Fi bị nghẽn](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-channel.html): Ở nơi có hàng chục router như chung cư, các thiết bị phải chia nhau cùng một kênh nên phải chờ tới lượt truyền. - [Bufferbloat (hàng đợi của router)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-bufferbloat.html): Khi ai đó trong nhà tải video lên hoặc tải file lớn xuống, hàng đợi của router dồn lượng gói tin tương đương hàng trăm ms, và gói tin game cũng phải chờ phía sau. - [Ánh xạ NAT hết hạn](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-nat.html): Router xóa khỏi bảng NAT các kết nối nhàn rỗi không có gói tin qua lại trong một thời gian. Đây là nguyên nhân phổ biến khiến người chơi đứng yên một lúc, vừa di chuyển là mất kết nối. - [Router yếu hoặc quá nhiệt](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-router.html): Khi một router giá rẻ phải gánh hàng chục thiết bị và hàng nghìn kết nối, bản thân router không xử lý nổi. - [Handover trạm phát sóng (khi đang di chuyển)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-handover.html): Khi di chuyển bằng xe buýt hay tàu điện ngầm, kết nối bị gián đoạn trong lúc máy đổi trạm phát sóng. - [Trễ chuyển trạng thái RRC (chế độ tiết kiệm điện của mạng di động)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-rrc.html): Khi không có dữ liệu trong một lúc, điện thoại hạ kết nối sóng xuống trạng thái tiêu thụ điện thấp, và đến gói tin kế tiếp phải kích hoạt lại nên bị trễ. - [Sóng di động yếu hoặc vùng lõm sóng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-weak-cell.html): Trong thang máy, tầng hầm hay sâu bên trong tòa nhà, số lần truyền lại tăng, tốc độ giảm và cuối cùng mất kết nối. - [Chuyển qua lại 5G↔LTE liên tục (vùng rìa phủ sóng 5G)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-5g-flip.html): Ở trong tòa nhà có sóng 5G yếu hoặc vùng rìa phủ sóng 5G, điện thoại liên tục chuyển qua lại giữa 5G và LTE, và mỗi lần chuyển ping lại vọt lên hoặc kết nối bị ngắt chốc lát. - [Giới hạn của Wi-Fi công cộng và mạng công ty](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/hn-captive.html): Trang đăng nhập của Wi-Fi quán cà phê hoặc tường lửa công ty chặn kết nối của game. ## L4 Đường truyền Internet - [Độ trễ lan truyền (khoảng cách vật lý)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-distance.html): Ngay cả ánh sáng trong cáp quang cũng chỉ đi được khoảng 200.000 km trong 1 giây. Server ở xa thì dù tốt đến đâu vẫn chậm. - [Internet vệ tinh (quỹ đạo thấp, địa tĩnh)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-satellite.html): Với Internet vệ tinh, sóng phải đi lên vũ trụ rồi quay về. Vệ tinh địa tĩnh chỉ riêng thời gian khứ hồi đã hơn 0,5 giây. Vệ tinh quỹ đạo thấp như Starlink bình thường thì nhanh, nhưng vào lúc tuyến đường được phân lại, độ trễ dao động và đôi khi kết nối đứt quãng trong chốc lát. - [Định tuyến đi đường vòng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-routing.html): Do hợp đồng kết nối giữa các nhà mạng, dữ liệu tới cả server ở gần cũng phải đi vòng qua nơi xa. - [Nghẽn peering vào giờ cao điểm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-peak.html): Khoảng 9–11 giờ tối, lưu lượng video tăng vọt nên đoạn kết nối giữa các nhà mạng (peering) dễ bị nghẽn. - [Sự cố cáp quang biển, đường truyền quốc tế](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-cable.html): Khi cáp quang biển bị đứt, dữ liệu phải đi vòng theo tuyến xa trong nhiều tuần (có khi nhiều tháng) cho đến khi sửa xong, và các đường truyền còn lại bị nghẽn. - [Thay đổi tuyến BGP và hội tụ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-bgp.html): Khi thông tin định tuyến trên Internet thay đổi, gói tin bị mất trong vài giây đến vài chục giây (hiếm khi vài phút) cho đến khi định tuyến hội tụ trở lại. - [Một đường ECMP bị lỗi](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-ecmp.html): Nhà mạng và trung tâm dữ liệu thường có nhiều đường cùng đi tới một đích, và mỗi kết nối được gán cố định vào một đường. Nếu chỉ một đường bị hỏng, chỉ những người được gán vào đường đó liên tục bị lag. - [Nhà mạng giới hạn tốc độ và quản lý lưu lượng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-shaping.html): Khi dùng vượt dung lượng data, hoặc với gói cước có quản lý một số loại lưu lượng, gói tin bị làm chậm hoặc bị bỏ. - [Hạn chế UDP và kiểm tra gói tin ở cấp quốc gia hoặc nhà mạng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-udp-block.html): Một số mạng chặn một số địa chỉ và cổng UDP nhất định hoặc giới hạn tốc độ UDP, còn thiết bị kiểm tra gói tin thì lọc bỏ các giao thức mà nó không nhận ra. Game giao tiếp bằng UDP sẽ không kết nối được hoặc hay bị mất kết nối trên các mạng đó. - [Chất lượng đường truyền kém](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-line.html): Đầu nối tiếp xúc kém, dây cũ hoặc modem trục trặc gây mất gói đều đặn và làm đường truyền bị ngắt theo chu kỳ. - [DNS lỗi hoặc chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-dns.html): Nếu DNS, dịch vụ đổi tên server thành địa chỉ, bị chậm hoặc lỗi thì game không tìm được server đăng nhập hay server cập nhật. - [Đường truyền dùng chung bị DDoS làm bão hòa](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-ddos-path.html): Các cuộc tấn công quy mô lớn nhắm vào công ty game, hoặc vào nơi khác trong cùng mạng, làm đầy đường truyền dùng chung. - [IP dùng chung của nhà mạng (CGNAT)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-cgnat.html): Mạng di động và một số nhà mạng cho nhiều thuê bao dùng chung một IP, và xóa ánh xạ (mapping) của kết nối nhàn rỗi sau một thời gian ngắn. - [Đi qua VPN hoặc phần mềm tăng tốc game](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/isp-vpn.html): Khi bật VPN hoặc phần mềm tăng tốc game, gói tin sẽ đi qua server trung chuyển của công ty đó. Nếu server trung chuyển ở xa hoặc đông, kết nối lại chậm hơn cả khi không bật. ## L5 Thiết bị mạng trung tâm dữ liệu - [Bảng phiên của tường lửa bị đầy](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-firewall.html): Tường lửa ghi mọi kết nối đã cho đi qua vào bảng phiên để theo dõi. Khi bảng đầy, tường lửa không nhận thêm được kết nối mới. - [Đi qua hệ thống chống DDoS, chặn nhầm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-ddos.html): Để chặn tấn công, lưu lượng được chuyển qua trung tâm lọc DDoS nên tuyến đường dài ra, và đôi khi người chơi bình thường bị nhầm là kẻ tấn công và bị chặn. - [Idle timeout của bộ cân bằng tải](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-lb-idle.html): Bộ cân bằng tải xóa kết nối nhàn rỗi sau một khoảng thời gian nhất định. Game vẫn coi là kết nối còn đó cho đến lúc bị mất kết nối. - [Hết hạn theo dõi kết nối của security group trên cloud](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-cloud-conntrack.html): Tường lửa gắn với server cloud (security group) cũng theo dõi kết nối, và mục theo dõi của kết nối nhàn rỗi sẽ hết hạn sau một khoảng thời gian định sẵn. Ngay cả với server nhận kết nối trực tiếp không qua bộ cân bằng tải, người chơi để yên một lúc cũng có thể bị mất kết nối. - [Giới hạn kết nối và cổng của NAT gateway trên cloud](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-nat-gateway.html): Các kết nối từ server trong subnet riêng đi ra ngoài (xác thực nền tảng, thanh toán, API bên ngoài) được NAT gateway đổi địa chỉ và cổng rồi gửi đi. Nếu số kết nối đồng thời tới cùng một đích vượt giới hạn cổng của gateway, kết nối mới sẽ thất bại. - [Bộ cân bằng tải phân bổ lệch, health check đánh giá sai](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-lb-imbalance.html): Kết nối dồn vào một server, hoặc người chơi cứ bị gửi tới server đã chết. - [Microburst ở switch](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-microburst.html): Khi nhiều server cùng lúc gửi dồn gói tin tới hàng nghìn người, bộ đệm nhỏ của cổng switch nơi lưu lượng đó hội tụ sẽ tràn trong chưa tới 1 ms. - [Đường truyền trung tâm dữ liệu bị bão hòa](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-uplink.html): Nếu việc phân phối bản cập nhật, gửi log, sao lưu dùng chung đường truyền với game thì đường truyền bị đầy. - [Failover thiết bị mạng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-failover.html): Khi một router hay tường lửa hỏng và chuyển sang thiết bị dự phòng (failover), mọi người đều bị đứng hình trong vài giây chuyển đổi đó. - [Cáp hỏng và lỗi cổng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-bad-cable.html): Nếu module quang hoặc cáp bị lỗi, gói tin đi qua đường đó bị hỏng theo một tỷ lệ nhất định. - [MTU không khớp (chỉ mất gói lớn)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dc-mtu.html): Khi MTU (kích thước gửi được trong một lần) của một chặng ở giữa nhỏ đi mà thông báo vượt kích thước lại bị chặn, chỉ các gói lớn liên tục bị mất. ## L6 Card mạng server - [Ngắt NIC dồn vào một core](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-irq.html): Nếu NIC chỉ gửi ngắt báo gói tin đến cho một core CPU, core đó sẽ thành điểm nghẽn. - [Ring buffer không đủ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-ring.html): Nếu ring buffer, nơi NIC tạm giữ gói tin, quá nhỏ thì khi gói dồn đến trong tích tắc, bộ đệm sẽ tràn và gói bị bỏ. - [Gộp ngắt quá mức](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-coalesce.html): Để giảm tải cho CPU, NIC gom gói tin lại rồi báo một lần, nên gói bị trễ đúng bằng thời gian gom. - [Vượt giới hạn PPS trên cloud](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-cloud-pps.html): Server cloud có giới hạn số gói mỗi giây và băng thông theo từng loại instance, vượt quá thì gói bị bỏ âm thầm. - [Băng thông NIC bị bão hòa](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-saturate.html): Khi dùng tới giới hạn của card 1 Gbps hay 10 Gbps, hàng đợi gửi dài ra và cuối cùng gói bị bỏ. - [Overhead ảo hóa và noisy neighbor](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-noisy.html): Nếu máy ảo khác trên cùng server vật lý dùng nhiều mạng và CPU, việc xử lý trên server của bạn bị chậm lại một cách thất thường. - [Bảo trì host cloud và live migration](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-host-maintenance.html): Khi nhà cung cấp cloud bảo trì server vật lý (host), họ chuyển máy ảo sang host khác (live migration) hoặc tạm dừng máy ảo một lúc. Trong lúc đó cả server bị đứng, nếu thời gian dừng dài thì kết nối bị ngắt. - [Lỗi driver hoặc firmware NIC](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-reset.html): Do lỗi driver hoặc tính năng hoạt động sai, card mạng bị treo và khởi động lại, trong lúc đó mọi việc gửi nhận đều bị ngắt. - [Độ trễ chờ gộp gói GRO/LRO](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/nic-offload.html): Đây là tính năng gộp nhiều gói thành một để giảm tải cho CPU. Tùy cấu hình, gói game nhỏ đôi khi phải chờ một chút gói tiếp theo để gộp cùng. ## L7 OS server (kernel) - [Tràn hàng đợi kết nối (backlog)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-backlog.html): Ngay sau bảo trì, khi hàng chục nghìn người chơi kết nối cùng lúc, hàng đợi kết nối (backlog) của kernel bị tràn và các yêu cầu kết nối bị bỏ. - [Giới hạn file descriptor](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-fd.html): Mỗi kết nối cần một file descriptor (fd, con số OS gán cho mỗi file hoặc socket đang mở), nhưng số fd mà một tiến trình được mở có giới hạn. - [Bộ đệm socket của kernel quá nhỏ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-sockbuf.html): Khi bộ đệm gửi và nhận nhỏ, lúc lưu lượng dồn thành burst, gói UDP nhận về sẽ bị bỏ, còn việc gửi qua TCP bị chặn vì bộ đệm hết chỗ. - [Quá nhiều thread và context switch](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-context.html): Chạy số thread nhiều hơn số core rất nhiều thì OS tốn CPU chỉ để cho chúng chạy luân phiên. - [CPU steal (máy ảo)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-steal.html): Trong lúc server vật lý (hypervisor) tạm chuyển thời gian CPU của một máy ảo cho máy ảo khác (CPU steal), server game bị dừng. - [CPU throttling trong container (CFS quota)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-cpu-quota.html): Khi container bị đặt giới hạn CPU, ngay lúc dùng hết quota trong một chu kỳ cố định (thường là 100 ms), container bị buộc dừng trong phần thời gian còn lại của chu kỳ đó (throttling). - [Độ trễ vọt lên do quản lý nguồn điện của server (C-state, điều chỉnh xung nhịp)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-cstate.html): Core CPU đang rảnh sẽ vào trạng thái tiết kiệm điện sâu (C-state) và hạ xung nhịp để tiết kiệm điện. Khi có gói tin hoặc timer đến, core cần thời gian để thức dậy và nâng xung nhịp, nên việc xử lý gói nhỏ bị cộng thêm độ trễ. - [OOM killer](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-oom.html): Khi bộ nhớ cạn, Linux chọn tiến trình dùng nhiều bộ nhớ nhất và buộc kết thúc (kill) nó. Thường đó là server game. - [Dừng do thu hồi bộ nhớ và compaction](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-reclaim.html): Tiến trình bị dừng trong lúc OS dồn bộ nhớ (compaction) để tạo huge page, hoặc thu hồi bộ nhớ để có thêm chỗ trống. - [Đồng hồ hệ thống nhảy (NTP step)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-timejump.html): Khi đồng hồ server bị chỉnh tới hoặc lùi vài giây trong một lần, các timer dựa vào đồng hồ hệ thống sẽ kích hoạt dồn một lượt hoặc dừng hẳn. - [Tác vụ theo lịch](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-cron.html): Các tác vụ nén log, sao lưu và quét bảo mật chạy vào cùng một giờ mỗi ngày chiếm CPU và ổ đĩa. - [Hiệu năng thay đổi sau khi cập nhật OS, kernel, driver hoặc firmware](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-os-update.html): Code game không đổi, nhưng server chậm đi kể từ khi cập nhật OS, kernel, driver hoặc firmware. Bản cập nhật có thể làm thay đổi giá trị mặc định, bộ lập lịch, các biện pháp giảm thiểu lỗ hổng CPU (mitigations) và cách driver hoạt động. - [Bảng conntrack của server bị đầy](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-conntrack.html): Khi bảng theo dõi kết nối (conntrack), nơi tường lửa Linux ghi lại mọi kết nối, chạm giới hạn, gói tin mới sẽ bị bỏ. - [Cạn cổng tạm (ephemeral port) ở kết nối giữa các server](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/so-ports.html): Khi server game mở rồi đóng kết nối ngắn tới DB hoặc server khác quá thường xuyên, các kết nối đã đóng vẫn chiếm giữ cổng một thời gian, nên không mở được kết nối mới. ## L8 Socket và giao thức - [TCP HOL blocking](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-hol.html): Để giữ đúng thứ tự, TCP không giao cho game các gói đến sau cho tới khi nhận lại được gói bị mất đó. - [TCP RTO và exponential backoff](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-rto.html): Mỗi lần truyền lại tiếp tục thất bại, thời gian chờ lại tăng gấp đôi, nên đường truyền chỉ đứt chốc lát cũng thành một lần đứng dài. - [Thuật toán Nagle + delayed ACK](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-nagle.html): Thuật toán Nagle (gom gói nhỏ lại để gửi) và delayed ACK (gửi ACK muộn) tác động chồng lên nhau, nên mỗi lần tách một message ra ghi nhiều lần là bị trễ 40–200 ms. - [Gửi bị chặn (blocking send) do client chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-block-send.html): Khi bộ đệm gửi của một người chơi có đường truyền chậm đã đầy mà server gửi theo kiểu blocking (lời gọi gửi không trả về cho tới khi bộ đệm có chỗ trống), thread của server phải chờ đúng một người đó. - [Chính sách xử lý client chậm (slow consumer)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-slow-client.html): Với client mà dữ liệu cần gửi cứ dồn lên mãi, server bỏ bớt các bản cập nhật cũ hoặc ngắt kết nối. - [Keepalive mặc định 2 giờ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-keepalive.html): Khi bên kia biến mất mà không gửi tín hiệu đóng kết nối, rất lâu sau TCP mới phát hiện. Keepalive (tính năng của TCP kiểm tra xem kết nối nhàn rỗi còn sống không) mặc định tắt, và dù có bật thì kết nối cũng phải nhàn rỗi 2 giờ mới bắt đầu kiểm tra. - [Phân mảnh IP của gói UDP](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-fragment.html): Gói UDP lớn hơn MTU (kích thước tối đa gửi được trong một lần) bị phân mảnh ở tầng IP, và chỉ cần mất một fragment là cả gói bị bỏ. - [Cấu hình truyền lại của UDP tin cậy](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-reliable-udp.html): Quy tắc truyền lại tự xây trên UDP mà quá thận trọng thì khôi phục chậm, còn quá mạnh tay thì càng làm nghẽn đường truyền. - [Slow start sau thời gian nhàn rỗi](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-slowstart.html): Khi kết nối nhàn rỗi một lúc, TCP thu nhỏ lại cửa sổ tắc nghẽn (lượng dữ liệu gửi được trong một lần), nên khi đột ngột gửi dữ liệu lớn, TCP phải chia ra gửi nhiều lượt. - [Lượng gửi giảm mạnh do kiểm soát tắc nghẽn](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-congestion.html): TCP coi mất gói là tín hiệu tắc nghẽn và giảm tốc độ gửi 30–50%. Mất gói do Wi-Fi cũng bị xử lý y như vậy. - [Mất dữ liệu cuối do đóng cưỡng bức bằng RST](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-linger.html): Khi server cắt kết nối đột ngột, thông báo cuối cùng hoặc tín hiệu đã lưu xong mà server vừa gửi sẽ bị mất. - [Kiến trúc I/O blocking](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-blocking-io.html): Với kiến trúc mà thread không làm được việc gì khác trong lúc chờ một socket, người chơi càng đông thì cả hệ thống càng chậm. - [SO_REUSEPORT phân phối bị lệch](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-reuseport.html): Khi nhiều tiến trình cùng nhận trên một cổng, kernel dùng hash địa chỉ để gán mỗi kết nối cho một tiến trình và không đổi lại. Nếu một tiến trình bị dừng, chỉ những người được gán vào đó phải chờ. - [Lỗi WSAECONNRESET trên socket UDP của Windows](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sk-udp-connreset.html): Khi server Windows gửi UDP tới một client đã rời đi, thông báo “không tới được cổng” (ICMP) sẽ gửi về. Thông báo này khiến lời gọi nhận tiếp theo kết thúc bằng lỗi; nếu code server coi lỗi đó là bản thân socket bị hỏng, mọi người dùng socket đó đều bị ảnh hưởng. ## L9 Tiến trình game phía server - [Vượt tick budget](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-tick-overrun.html): Khi khối lượng việc trong một tick vượt budget, chu kỳ tick của server bị kéo dài, và cả khu vực đó chạy chậm lại hoặc giật khựng. - [Tính toán tầm nhìn (AOI) bùng nổ (N²)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-aoi.html): Nếu so sánh mọi người với nhau để xem ai thấy được ai, số người tăng 10 lần thì khối lượng tính toán tăng 100 lần. - [Broadcast bùng nổ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-broadcast.html): Gửi chuyển động của một người cho tất cả những ai nhìn thấy người đó thì số bản cập nhật phải gửi tăng theo bình phương số người tụ tập. - [Quá tải khu vực chạy trên một thread (hotspot)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-hotzone.html): Với kiến trúc mỗi khu vực do một thread phụ trách, khi người chơi dồn vào một chỗ, chỉ một core đó lên 100%. - [Tranh chấp lock](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-lock.html): Khi nhiều thread cùng chờ một lock để ghi cùng một dữ liệu, dù có thêm thread thì mỗi lúc cũng chỉ một thread chạy. - [Deadlock](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-deadlock.html): Khi hai thread chờ lock mà bên kia đang giữ, cả hai sẽ đứng mãi mãi. - [Gọi đồng bộ (blocking) trên game thread](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-sync-call.html): 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 đó. - [Hàng đợi message bị dồn ứ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-queue.html): Khi yêu cầu đến nhanh hơn tốc độ xử lý và dồn vào hàng đợi, các yêu cầu phía sau vài giây sau mới được xử lý hoặc bị bỏ. - [Timer kích hoạt dồn cùng lúc](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-timer-burst.html): Khi mọi lượt respawn quái, mọi buff hết hạn và phần thưởng lúc tròn giờ dồn vào cùng một tick, riêng tick đó nặng lên gấp hàng chục lần. - [Tìm đường (pathfinding) dồn dập](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-pathfinding.html): Hàng trăm con quái cùng lúc đuổi theo người chơi và tính đường đi thì tốn rất nhiều CPU. - [Chi phí serialize và nén](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-serialize.html): Việc chuyển dữ liệu cần gửi thành byte và nén cũng tốn CPU, và khi đông người, chi phí này tăng vọt. - [Server crash](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-crash.html): Khi tiến trình server chết vì một lỗi không được xử lý, mọi người trên server đó mất kết nối cùng lúc. - [Cạn thread pool](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-threadpool.html): Khi mọi worker thread xử lý việc đều bị kẹt ở các việc chậm, yêu cầu mới chỉ biết chờ vô thời hạn. - [Vòng lặp vô hạn và logic chạy mất kiểm soát](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-infinite-loop.html): Khi một bug khiến tick không bao giờ kết thúc, server bị treo và watchdog buộc khởi động lại. - [Giao tranh dồn vào một mục tiêu (world boss)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-hot-entity.html): Khi hàng trăm người cùng đánh một boss, phần tính toán cho một con boss dồn vào một chỗ, và thông tin đòn đánh được gửi cho mọi người đang nhìn thấy. - [Spawn dồn dập khi vào khu vực đông người](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-spawn-burst.html): Khi bạn teleport vào một thị trấn chật kín người, server phải gửi cùng lúc ngoại hình, trang bị và trạng thái của hàng trăm người vừa lọt vào tầm nhìn. - [Đối tượng tích tụ (vật phẩm và vật triệu hồi không được dọn)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-entity-buildup.html): Vật phẩm rơi trên đất, vật triệu hồi, timer đã xong lẽ ra phải biến mất. Nếu chúng không được dọn mà cứ tích tụ, server chạy càng lâu thì mỗi tick càng nhiều việc. - [Bản cập nhật làm thay đổi mô hình lưu lượng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sp-patch-traffic.html): Khi nội dung, hiệu ứng hoặc trường đồng bộ mới làm tăng kích thước và tần suất gói tin, server đang chạy tốt bắt đầu chạm giới hạn MTU, băng thông và số gói kể từ sau bản cập nhật. ## L10 Bộ nhớ - [GC dừng toàn bộ server](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-gc.html): Trong lúc server Java hoặc C# dừng mọi thread để thu gom rác (stop-the-world), toàn bộ server đứng lại. - [GC pause của script engine](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-script-gc.html): Ngay cả server viết bằng C++, nếu nhiệm vụ, AI và skill chạy bằng script như Lua thì trong lúc GC của script engine chạy, zone đó sẽ bị dừng. - [Cấp phát bộ nhớ dồn dập](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-alloc.html): Khi sự kiện tạo ra hàng loạt đối tượng tạm, GC phải chạy thường xuyên hơn nhiều so với bình thường. - [Rò rỉ bộ nhớ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-leak.html): 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. - [GC thrashing (heap còn ít chỗ trống)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-gc-thrash.html): Khi dữ liệu còn sống gần chạm giới hạn heap, GC chạy xong cũng gần như không thu hồi được gì, nên GC cứ lặp lại không ngừng. - [Swap](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-swap.html): 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. - [Cache miss](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-cache-miss.html): Khi dữ liệu nằm rải rác khắp bộ nhớ, lần nào CPU cũng phải đi tới tận RAM vốn chậm hơn và chờ. - [Phân mảnh bộ nhớ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-fragment.html): Cấp phát và giải phóng lặp đi lặp lại làm vùng trống bị chia vụn, khiến tiến trình chiếm nhiều bộ nhớ hơn hẳn lượng thực sự dùng. - [Truy cập bộ nhớ NUMA từ xa](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/mem-numa.html): Trên server có hai CPU, nếu tiến trình dùng bộ nhớ gắn với CPU bên kia thì truy cập bộ nhớ chậm đi. ## L11 Ổ đĩa - [Ghi log đồng bộ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-sync-log.html): Nếu thread game chờ ổ đĩa ghi xong từng dòng log, thì lúc ổ đĩa bận, game cũng bị dừng theo. - [fsync dồn dập](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-fsync.html): 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. - [Cạn burst credit của ổ đĩa cloud](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-burst.html): Một số ổ đĩa cloud và cấu hình server nhỏ có burst credit cho phép tạm chạy nhanh hơn mức cơ bản. Khi giờ bận kéo dài làm credit cạn, tốc độ đột ngột tụt xuống. - [Chạm giới hạn IOPS, hàng đợi bão hòa](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-iops.html): Khi vượt số yêu cầu ổ đĩa xử lý được trong 1 giây, hàng đợi dài ra và độ trễ tăng vọt. - [Ổ đĩa đầy](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-full.html): Khi log và dump tích tụ làm ổ đĩa đầy, thao tác ghi thất bại, và nếu không có phương án dự phòng thì server sập. - [Tác vụ sao lưu, nén, quét](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-backup.html): Khi sao lưu lúc rạng sáng, nén log hoặc quét bảo mật chiếm trọn ổ đĩa, việc đọc ghi của server game bị dồn lại. - [Lazy loading phía server](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-lazy-load.html): Nếu server đợi đến lần đầu có yêu cầu mới đọc dữ liệu phó bản hay bản đồ từ ổ đĩa, thì trong tick đó mọi người đều bị dừng. - [Ghi core dump](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-coredump.html): Khi server sập, việc ghi vài GB bộ nhớ xuống ổ đĩa có thể làm việc khởi động lại chậm mất vài phút. - [Độ trễ seek của HDD](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/dk-hdd.html): HDD phải di chuyển đầu đọc trên đĩa từ (seek), nên mỗi lần đọc ghi dữ liệu nằm rải rác mất gần 10 ms. ## L12 Cơ sở dữ liệu - [Query không có index](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-no-index.html): Không có index thì muốn tìm các dòng thỏa điều kiện, DB phải đọc toàn bộ bảng (full scan). - [Tranh chấp khóa trên hot row](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-hot-row.html): Khi ai cũng muốn sửa cùng một dòng (kho bang hội, vật phẩm hot ở nhà đấu giá, bộ đếm toàn server), mỗi lúc chỉ một người lấy được khóa. - [Deadlock trong DB](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-deadlock.html): Khi hai transaction (nhóm thao tác DB được xử lý như một khối) chờ dòng mà bên kia đã khóa, DB buộc phải hủy một bên. - [Cạn connection pool](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-pool.html): Số kết nối tạo sẵn tới DB là cố định, nên khi query chậm chiếm giữ kết nối, các yêu cầu còn lại phải chờ. - [Replication lag](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-replica-lag.html): Khi ghi vào DB chính và đọc từ bản sao, nếu bản sao bị tụt lại phía sau thì nội dung vừa ghi sẽ chưa hiện ra. - [Checkpoint, flush log](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-checkpoint.html): Đúng lúc DB định kỳ ghi dồn các thay đổi trong bộ nhớ xuống ổ đĩa, query chậm đi. - [Cache lạnh (ngay sau khởi động lại)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-cold-cache.html): Khi DB khởi động lại, cache trong bộ nhớ trống trơn, nên một thời gian mọi truy vấn đều phải đọc từ ổ đĩa. - [Đăng nhập ồ ạt và query N+1](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-login-storm.html): Nếu tải một nhân vật mà phải truy vấn riêng lẻ vài chục lần, thì vài chục nghìn người đăng nhập cùng lúc sẽ thành hàng triệu query. - [Tác vụ batch khối lượng lớn](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-batch.html): Nếu chạy tổng hợp bảng xếp hạng, gửi thư hàng loạt hay dọn dữ liệu cũ trong lúc đang vận hành, các tác vụ này sẽ chiếm khóa và ổ đĩa. - [Failover DB](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-failover.html): Trong lúc DB chính chết và chuyển sang DB dự phòng, không ghi được dữ liệu, và phần dữ liệu cuối cùng chưa kịp replicate có thể bị mất. - [Mất tiến độ do chu kỳ lưu dài](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-save-interval.html): Nếu để giảm tải mà vài phút mới lưu một lần, thì khi server sập giữa hai lần lưu, tiến độ chơi sẽ mất. - [Cache stampede](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-cache-stampede.html): Khi cache của dữ liệu được dùng nhiều hết hạn cùng lúc, hàng nghìn yêu cầu đồng loạt dồn về DB. - [Transaction mở quá lâu](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-long-tx.html): Nếu một transaction mở quá lâu, nó giữ khóa mãi, và DB không dọn (purge) được dữ liệu phiên bản cũ nên toàn bộ hệ thống chậm dần. - [Lệnh Redis chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-redis-block.html): Redis xử lý lần lượt từng lệnh một, nên một lệnh chậm sẽ chặn mọi yêu cầu phía sau. - [Query chậm do kế hoạch thực thi thay đổi](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-plan-flip.html): Code không đổi, nhưng nếu DB đổi cách xử lý cùng một query (kế hoạch thực thi), query hôm qua mất 2 ms thì hôm nay mất vài trăm ms. - [Khóa do thay đổi schema (DDL) khi đang vận hành](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/db-ddl-lock.html): Nếu thêm cột hay index vào bảng trong lúc đang phục vụ, chỉ vì một khóa cần trong chốc lát mà mọi yêu cầu dùng bảng đó có thể phải chờ. ## L13 Kiến trúc và vận hành server - [Đi qua gateway hoặc proxy](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-gateway.html): Khi đặt một server trung gian giữa client và server game, mỗi lần đi qua nó lại cộng thêm thời gian xử lý, và server đó trở thành điểm lỗi duy nhất (single point of failure). - [Chuyển zone (chuyển giao giữa các server)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-zone-transfer.html): Khi nhân vật vào bản đồ hoặc phó bản khác, thông tin nhân vật phải được chuyển sang server khác, và quá trình này có thể bị chậm hoặc thất bại. - [Sự cố dây chuyền](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-cascade.html): Khi một service chậm đi, các server gọi đến nó bị giữ lại để chờ phản hồi, và cả những tính năng không liên quan cũng đứng lại. - [Sự cố server phụ trợ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-subservice.html): Khi một server chạy tách riêng khỏi server game như chat, tổ đội, nhà đấu giá gặp sự cố, chỉ riêng tính năng đó ngừng hoạt động. - [Triển khai và khởi động lại](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-deploy.html): Khi khởi động lại server để cập nhật mà không chuyển kết nối đi nơi khác, những người đang ở server đó bị mất kết nối, đồng thời việc lưu dữ liệu ngay trước khi tắt và việc kết nối lại dồn vào cùng một lúc. - [Autoscaling chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-autoscale.html): Khi đông người, số server được tự động tăng lên nhưng phải mất vài phút mới sẵn sàng, và trong thời gian đó các server hiện có bị quá tải. - [Quá tải log và giám sát](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-monitoring.html): Khi có sự cố, log tăng đột biến, và server gửi log theo kiểu đồng bộ lại càng chậm hơn vì chính log. - [Lệch đồng hồ giữa các server](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-clock-skew.html): Nếu đồng hồ của các server lệch nhau một chút, việc phán định hồi chiêu, buff, thời điểm bắt đầu sự kiện sẽ không khớp giữa các server. - [Quá nhiều macro và bot](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-bots.html): Bot gửi yêu cầu thường xuyên hơn người thật rất nhiều, dần chiếm mất năng lực xử lý của server. - [Phụ thuộc service bên ngoài](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-external.html): Khi service bên ngoài như đăng nhập qua nền tảng, thanh toán, xác thực danh tính chậm hoặc ngừng, người chơi bị kẹt ở đúng bước đó. - [Lỗi matchmaking hoặc phân bổ region](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-region-match.html): Nếu bị xếp vào server ở region xa thay vì region gần, dù đường truyền vẫn ổn, riêng người chơi đó luôn có ping cao. - [Chứng chỉ TLS hết hạn hoặc cấu hình sai](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-cert.html): Khi chứng chỉ của server đăng nhập, API hoặc server patch hết hạn hoặc thiếu chứng chỉ trung gian, kết nối TLS của các client kết nối mới sẽ thất bại kể từ thời điểm đó. - [Giới hạn hàng chờ đăng nhập, thiếu thời gian giữ chỗ khi kết nối lại](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/in-login-queue.html): Ngay sau khi ra mắt hoặc bảo trì, lượng kết nối dồn đến khiến hàng chờ đăng nhập chạm giới hạn và từ chối lượt chờ mới, còn người chơi đang chờ chỉ cần mất kết nối trong giây lát là mất chỗ và phải quay về cuối hàng. ## Thiết kế đồng bộ - [Chỉ hiển thị sau khi server phản hồi (mô hình yêu cầu-phản hồi)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-request-response.html): Khi bấm nút, không có animation hay âm thanh nào cho đến khi server trả lời. Ping trở thành chính tốc độ phản hồi. - [Giao thức nhiều lượt khứ hồi tuần tự (chatty)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-chatty.html): Nếu một thao tác cần nhiều lượt khứ hồi tới server theo thứ tự, ping bị nhân lên đúng bấy nhiêu lần. - [Không có buffer input cho skill](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-no-queue.html): Nếu phải nhận xác nhận từ server rằng skill trước đã xong mới bấm được skill tiếp theo, mỗi nhịp combo sẽ bị chen thêm một khoảng thời gian khứ hồi. - [Khung phán định ngắn bị ping ăn mất](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-short-window.html): Nếu thời gian phải phản ứng ngắn như né tránh, parry, đỡ đòn, ping sẽ ăn mất khoảng thời gian đó và tạo ra những đòn không thể né. - [Phán định không có bù trễ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-no-lagcomp.html): Nếu server chỉ phán định trúng đích bằng “vị trí hiện tại trên server”, phán định sẽ lệch với những gì bạn thấy trên màn hình. - [Bù trễ quá mức](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-lagcomp-overreach.html): Nếu quay ngược quá xa theo góc nhìn của người tấn công, người bị bắn dù đã nấp vẫn bị trúng. - [Client có thẩm quyền](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-client-auth.html): Nếu mỗi client tự quyết định kết quả của mình, màn hình của bạn mượt mà nhưng kết quả lệch với màn hình người khác và dễ bị hack. - [Lockstep phải chờ người chơi chậm nhất](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-lockstep.html): Trong cấu trúc mọi người cùng tính chung một lượt, chỉ cần input của một người đến muộn là tất cả phải chờ. - [Rollback netcode dự đoán sai](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-rollback.html): Game dự đoán input của đối thủ để hiển thị trước, nếu sai thì quay ngược lại và tính lại. Ping càng lớn thì khoảng quay ngược càng lớn. - [Phát ngay khi nhận, không có timestamp](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-no-timestamp.html): Nếu sự kiện từ server không kèm thời điểm xảy ra mà được phát ngay khi nhận, thời điểm hiển thị sẽ lệch lung tung đúng theo jitter của mạng. - [Chờ tick hai lần](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-double-tick.html): Nếu gom yêu cầu tới tick sau mới xử lý, rồi kết quả lại đợi đến tick sau nữa mới gửi, khoảng cách tick bị cộng vào hai lần. - [Server kiểm tra quá chặt](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-strict-check.html): Nếu server kiểm tra tốc độ di chuyển, hồi chiêu, tầm đánh quá chặt, cả những input hợp lệ bị dồn lại do jitter cũng bị từ chối. - [Cấu trúc host (chủ phòng)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-host.html): Nếu PC của một người chơi đóng vai server, đường truyền và hiệu năng PC của người đó quyết định cảm nhận của tất cả mọi người. - [Server từ chối sau khi đã hiển thị trước](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-optimistic-reject.html): Nếu server không công nhận đòn đánh hay skill đã được hiển thị trước trên màn hình của bạn, kết quả bạn thấy rõ ràng lại bị coi như chưa từng xảy ra. - [Tính toán đường đi không khớp khi đồng bộ lệnh](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-path-mismatch.html): Nếu hai bên chỉ trao đổi “đi tới đây” còn đường đi thì mỗi bên tự tính, chỉ cần tính lệch một chút là nhân vật hay quái sẽ đi theo đường khác rồi bị kéo về chỗ cũ. - [Tần suất gửi snapshot thấp](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/sy-low-send-rate.html): Nếu server chỉ gửi bản cập nhật vị trí (snapshot) vài lần trong 1 giây, bộ đệm nội suy phải đặt dài tương ứng, nên bạn thấy các nhân vật khác ở quá khứ xa hơn. ## Sự cố chỉ một số người gặp - [Người chơi chậm di chuyển dồn cục trên màn hình người khác](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-slow-burst.html): Input của người có đường truyền kém tới server lúc thưa lúc dồn. Nếu server áp dụng đúng số lượng nhận được ở mỗi tick, trong mắt người khác nhân vật đó sẽ khựng lại rồi đi một lúc nhiều bước. - [Tua nhanh do server xử lý ngay khi gói tới](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-event-server.html): Ở server xử lý và thông báo ngay khi gói tin tới, các hành động dồn lại của người chơi chậm sẽ được thực thi liên tiếp ngay lập tức. - [Kích thước bộ đệm input theo người chơi](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-input-buffer.html): Nếu server gom input của mỗi người một chút rồi lấy ra một input mỗi tick, người khác thấy mượt, nhưng thời điểm hành động của chính người đó được xác nhận trên server sẽ muộn đi tương ứng. - [Báo nhầm khi kiểm tra, dồn vào người chơi dùng một nhà mạng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-isp-validation.html): Người chơi dùng đường truyền có jitter lớn có input tới dồn cục, nên hay bị vướng các bước kiểm tra tốc độ và hồi chiêu của server. - [Một đồng đội chậm và cơ chế boss](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-raid-member.html): Trong cơ chế raid đòi hỏi mọi người cùng phản ứng vào một thời điểm định sẵn, phản ứng muộn của một người chậm sẽ thành thất bại của cả tổ đội. - [Quyền điều khiển quái nằm ở client chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-mob-control.html): Có những game giao việc tính di chuyển của quái cho client của một người chơi ở gần để giảm tải server. Nếu đường truyền của người đó kém, con quái đó di chuyển kỳ lạ trên màn hình của mọi người. - [Dữ liệu của một nhân vật quá lớn](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-heavy-char.html): Nhân vật tích hàng nghìn vật phẩm, thư, hoặc có danh sách bạn bè, danh sách chặn, buff nhiều bất thường thì lượng dữ liệu phải xử lý khi vào game, khi lưu và khi thông báo cho xung quanh lớn gấp nhiều lần người khác. Chỉ nhân vật đó chậm, bất kể đường truyền. - [Khác kênh, instance hoặc phasing](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-phase.html): Nếu hai nhân vật ở khác kênh hoặc khác instance, hoặc ở “phasing” khác nhau (NPC hiển thị khác nhau tùy tiến độ nhiệm vụ), hai bên sẽ thấy hai thế giới khác nhau. - [Bỏ thông báo xuất hiện tới trong lúc loading](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-loading-drop.html): Ngay khi nhân vật vào zone, server gửi thông báo xuất hiện của các NPC xung quanh, nhưng client vẫn đang tải bản đồ nên bỏ thông báo đó đi. - [Thứ tự đăng ký tầm nhìn bị rối](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-aoi-race.html): Nếu thời điểm nhân vật được đăng ký vào lưới tầm nhìn trùng với thời điểm NPC chuyển ô lưới, thông báo xuất hiện của NPC đó có thể bị sót. - [Mất snapshot gốc (baseline)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-baseline.html): Với cách server chỉ gửi “những gì khác so với lần trước”, nếu mất thông tin đầy đủ (bản gốc) gửi một lần lúc đầu thì các phần thay đổi sau đó không thể áp dụng được. - [Mất thông báo rời đi (đối tượng ma)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-ghost.html): Ngược lại, nếu bỏ lỡ thông báo “đã biến mất”, NPC hoặc người chơi đã chết hay đã rời đi vẫn còn trên màn hình của riêng bạn. - [Mất thông tin xuất hiện dồn tới ngay sau khi vào](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-spawn-burst.html): Ngay khi nhân vật bước vào zone, server gửi cùng lúc thông tin xuất hiện của vài chục đến vài trăm đối tượng xung quanh. Nếu gửi chúng qua kênh không tin cậy (unreliable), hoặc bộ đệm nhận bị tràn trong lúc client đang loading nên không đọc socket, một phần sẽ biến mất và không được gửi lại. - [Nhầm lẫn do dùng lại ID đối tượng](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-id-reuse.html): Khi NPC đã chết xuất hiện lại mà server dùng lại cùng ID đối tượng, client đã bỏ lỡ thông báo rời đi trong khoảng đó sẽ nhầm NPC mới là NPC cũ. - [Xung đột cổng UDP cố định](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-port-collision.html): Nếu client được viết để dùng một cổng cục bộ cố định, client thứ hai trên cùng PC sẽ không dùng được cổng đó hoặc phải chia gói tin nhận được với client thứ nhất. - [Lỗi phân biệt phiên theo IP hoặc thiết bị](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-session-key.html): Nếu server hoặc server trung gian phân biệt kết nối bằng IP hay ID thiết bị, hai client trên cùng một PC (cùng IP công cộng) sẽ bị coi là một người. - [Giới hạn chạy nhiều client](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-multiclient.html): Nếu module bảo mật hoặc chính sách server giới hạn nhiều client trên một PC, client thứ hai sẽ bị chặn chạy hoặc chặn kết nối, hoặc client bật trước bị mất kết nối. Một số game chỉ chặn tính năng của client chạy thêm. - [Giới hạn xử lý ở cửa sổ chạy nền](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-background.html): Với client ở cửa sổ chạy nền, game, engine và OS đều giảm khung hình và việc xử lý. Gói tin nhận được không được xử lý kịp nên bị dồn lại hoặc tràn. - [Xung đột khi cùng truy cập file cache hoặc asset](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-asset-lock.html): Nếu hai client cùng ghi vào một thư mục cache hoặc khóa file, một bên sẽ không tải được model, texture của NPC. - [Streaming thất bại do thiếu bộ nhớ hoặc VRAM](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-vram.html): Khi hai client dùng chung bộ nhớ đồ họa, không còn chỗ để nạp model, texture mới cần dùng nên một phần không được vẽ. - [Khác tùy chọn hiển thị](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-display-option.html): Nếu các tùy chọn như giới hạn số người hiển thị, ẩn bảng tên hoặc model NPC, chế độ cấu hình thấp khác nhau giữa hai client, những gì nhìn thấy sẽ khác nhau. - [Phiên bản hoặc dữ liệu client không khớp](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-version.html): Nếu client thứ hai là bản cài đặt khác hoặc chưa cập nhật xong, nó không biết ID NPC mới mà server gửi nên âm thầm bỏ qua. - [Ngân sách gửi và mức ưu tiên theo kết nối](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-priority.html): Nếu server đặt giới hạn lượng gửi cho từng kết nối và gửi những thứ ở gần trước, bên có giới hạn thấp sẽ nhận NPC ở xa muộn hoặc không nhận được. - [Đối tượng bị giữ lại do ước tính đồng hồ sai](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/pt-clock-hold.html): Nếu giờ server mà client ước tính bị sai, client sẽ giữ lại thông tin đối tượng vừa tới vì cho là “vẫn còn ở tương lai”, hoặc bỏ đi vì cho là “quá cũ”. ## Nguyên nhân gốc của truyền lại TCP - [Mất gói ở chặng không dây](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-wireless.html): Wi-Fi và mạng di động tự truyền lại vài lần trên chặng không dây, nếu vẫn không được thì bỏ gói tin. Gói đã bị bỏ phải đợi khá lâu sau đó TCP mới gửi lại. - [Tràn hàng đợi ở điểm nghẽn (mất gói do tắc nghẽn)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-queue-drop.html): Khi hàng đợi ở chỗ hẹp nhất trên đường đi (router, chặng kết nối giữa các nhà mạng, đường truyền của trung tâm dữ liệu) đầy, gói tin mới đến sẽ bị bỏ. - [Burst gửi làm tràn bộ đệm nhỏ](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-burst.html): Mỗi tick, nếu server dồn bản cập nhật cho hàng nghìn người rồi gửi đi trong một khoảnh khắc, bộ đệm nhỏ của switch hoặc giới hạn tức thời của cloud sẽ tràn trong chưa đầy 1 ms và một phần gói tin bị bỏ. - [Policer bỏ phần vượt mức](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-policer.html): Gói cước của nhà mạng, giới hạn của instance cloud và thiết bị chống DDoS đôi khi bỏ ngay các gói vượt tốc độ quy định mà không đưa vào hàng đợi. - [Lỗi vật lý (cáp, module quang, đầu nối hỏng)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-physical.html): Cáp bị hỏng, đầu nối quang bám bụi, module quang hết tuổi thọ sẽ gây lỗi bit, và thiết bị âm thầm bỏ các gói bị hỏng. - [Không khớp chế độ duplex](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-duplex.html): Nếu một đầu để tự động đàm phán (auto-negotiation) còn đầu kia cố định tốc độ và duplex, một bên sẽ chạy half-duplex và mỗi lần có tải lại mất gói do va chạm (collision). - [Host server nhận bỏ gói tin](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-host-drop.html): Gói tin đã đến được server nhưng bị bỏ vì ring buffer của NIC (bộ đệm tạm giữ gói tin vừa đến) bị tràn, hoặc core xử lý nhận gói của kernel bị bão hòa. - [Tường lửa và theo dõi kết nối bỏ gói](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-stateful-fw.html): Tường lửa hoặc tính năng theo dõi kết nối của Linux (conntrack, ghi các kết nối đi qua vào một bảng) sẽ bỏ gói tin khi bảng đầy hoặc khi xác định trạng thái kết nối không khớp. - [Thiết bị trung gian vượt giới hạn xử lý (tường lửa, IPS, chống DDoS)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-appliance-pps.html): Tường lửa, thiết bị chống xâm nhập (IPS) và thiết bị chống DDoS kiểm tra từng gói tin đi qua. Từ lúc vượt năng lực kiểm tra, thiết bị bỏ những gói không xử lý kịp. - [MTU black hole (chỉ gói lớn liên tục bị mất)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-mtu.html): Khi kích thước tối đa mà một chặng giữa đường nhận được bị giảm đi nhưng thông báo “quá lớn” (ICMP) lại bị chặn, gói lớn gửi lại bao nhiêu lần cũng tiếp tục biến mất. - [Ánh xạ NAT hoặc bộ cân bằng tải hết hạn giữa chừng kết nối](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-mapping.html): Nếu thiết bị trung gian xóa ánh xạ (mapping: mục ghi lại kết nối này cần được chuyển tới đâu) của một kết nối nhàn rỗi, gói gửi tiếp theo sẽ không được chuyển đi. Bên gửi chỉ truyền lại liên tục rồi mất kết nối, hoặc thiết bị gửi trả gói từ chối kết nối (RST) khiến kết nối đứt ngay. - [Đổi tuyến đường hoặc tuyến ECMP lỗi](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-path.html): Gói tin biến mất trong vài giây lúc tuyến đường Internet thay đổi, hoặc trên kết nối được gán vào tuyến lỗi trong số nhiều tuyến ECMP. - [Truyền lại không cần thiết do độ trễ tăng vọt](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-spurious-delay.html): Gói tin vẫn đến nơi, chỉ là đến rất muộn trong chốc lát; nếu độ trễ đó dài hơn RTO thì bên gửi xác định là mất rồi truyền lại. - [Truyền lại nhanh không cần thiết do gói đến sai thứ tự](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-reorder.html): Khi đi qua nhiều tuyến hoặc các link được gộp, thứ tự gói tin có thể bị đảo; bên nhận dùng ACK trùng (duplicate ACK) để báo “có gói bị thiếu”, và bên gửi gửi lại cả gói vẫn còn nguyên vẹn. - [ACK đến muộn hoặc bị mất (chiều tải lên bị bão hòa)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-ack-path.html): Dữ liệu đã đến nơi, nhưng nếu ACK báo “đã nhận” bị trễ hoặc bị mất trong hàng đợi upload đang đầy, bên gửi sẽ xác định là mất gói rồi truyền lại. - [Cấu hình RTO không hợp với môi trường](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-rto-setting.html): Hạ RTO tối thiểu quá thấp thì chỉ trễ một chút cũng sinh ra truyền lại không cần thiết, còn giá trị mặc định (200 ms) lại quá dài với game nên mỗi lần mất gói là đứng lâu. - [Thin stream phục hồi chậm](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-thin.html): Khi gửi gói nhỏ thưa thớt như game, RTO đến trước khi gom đủ “3 gói theo sau”. Với cùng mức mất gói, game đứng lâu hơn nhiều so với khi truyền dữ liệu dung lượng lớn. - [Thiết bị trung gian xóa tùy chọn TCP](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-sack-stripped.html): Nếu một số tường lửa hoặc thiết bị tăng tốc xóa hay sửa tùy chọn TCP, khi mất nhiều gói thì mỗi vòng khứ hồi chỉ phục hồi được một gói, hoặc cửa sổ (lượng dữ liệu gửi được trong một lần) bị thu nhỏ, khiến kết nối chậm đi. - [Zero window (khoảng dừng dễ nhầm là truyền lại)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-zero-window.html): Nếu chương trình bên nhận không đọc socket kịp khiến bộ đệm đầy, bên gửi sẽ ngừng gửi và chỉ gửi zero window probe. Đường truyền không có vấn đề gì. - [Truyền lại yêu cầu kết nối (SYN)](https://jungrok5.github.io/mmo-lag-anatomy/vi/c/rt-syn.html): Khi yêu cầu kết nối biến mất do hàng đợi kết nối (backlog) bị tràn hoặc bị tường lửa chặn, OS phía client sẽ gửi lại, bắt đầu sau 1 giây và giãn dần khoảng cách. ## Chẩn đoán và sự cố thực tế - [Chẩn đoán từ dữ liệu quan sát](https://jungrok5.github.io/mmo-lag-anatomy/vi/#judge): Quy trình chẩn đoán Phạm vi → Thời điểm → Tầng, bảng tín hiệu chẩn đoán, 13 dạng đồ thị, cách đọc số liệu (trung bình và p99) - [Quy trình theo tình huống](https://jungrok5.github.io/mmo-lag-anatomy/vi/text.html#playbooks): Lag sau bản cập nhật, mở thêm quốc gia hoặc khu vực ở nước ngoài - [Sự cố thực tế](https://jungrok5.github.io/mmo-lag-anatomy/vi/text.html#cases): Các bản postmortem do nhà phát triển gốc hoặc nhà vận hành công bố, kèm nguyên nhân liên quan ## Ngôn ngữ khác - [한국어 (Korean)](https://jungrok5.github.io/mmo-lag-anatomy/llms.txt) - [English](https://jungrok5.github.io/mmo-lag-anatomy/en/llms.txt) - [日本語 (Japanese)](https://jungrok5.github.io/mmo-lag-anatomy/ja/llms.txt) - [简体中文 (Chinese (Simplified))](https://jungrok5.github.io/mmo-lag-anatomy/zh-cn/llms.txt) - [繁體中文 (Chinese (Traditional, Taiwan))](https://jungrok5.github.io/mmo-lag-anatomy/zh-tw/llms.txt) - [Deutsch (German)](https://jungrok5.github.io/mmo-lag-anatomy/de/llms.txt) - [ไทย (Thai)](https://jungrok5.github.io/mmo-lag-anatomy/th/llms.txt) - [Русский (Russian)](https://jungrok5.github.io/mmo-lag-anatomy/ru/llms.txt) - [Português (Brasil) (Portuguese (Brazil))](https://jungrok5.github.io/mmo-lag-anatomy/pt-br/llms.txt) - [Español (Spanish)](https://jungrok5.github.io/mmo-lag-anatomy/es/llms.txt) - [Bahasa Indonesia (Indonesian)](https://jungrok5.github.io/mmo-lag-anatomy/id/llms.txt) ## Optional - [Kho mã GitHub](https://github.com/jungrok5/mmo-lag-anatomy): Mã nguồn, định dạng dữ liệu, cách đóng góp - [Tác giả: Jeongrok Oh](https://jungrok5.github.io/resume/en/): CV