게임 렉 백서 › 증상별로 찾기
씹힘·롤백: 원인 36가지와 담당
다른 말: 스킬 씹힘, 아이템 되돌아감, 거래 실패
그림이 있는 원본 증상 사전으로 열기 →
분명히 한 행동이 없던 일이 되거나, 결과가 한참 뒤 뒤집힙니다.
스킬을 눌렀는데 발동 안 함. 산 아이템이 사라지거나 재접속하니 몇 분 전 상태.
요청이 사라졌거나(손실, 대기열 넘침), 서버가 내 화면과 다르게 판정했거나(판정 시점 차이, 선연출 뒤 거절), 저장 도중 실패했습니다(DB 잠금·장애, 서버 크래시).
이 증상을 만드는 원인
L1 클라이언트 게임 프로세스
- 시계 동기화 오차: 클라이언트가 추정한 서버 시각이 틀리면 보간 시점과 쿨타임 판정이 어긋납니다. (게임개발팀·클라이언트 개발)
L5 데이터센터 네트워크 장비
- 클라우드 NAT 게이트웨이 연결·포트 한도: 사설 서브넷의 서버가 외부(플랫폼 인증·결제·외부 API)로 나가는 연결은 NAT 게이트웨이가 주소와 포트를 바꿔 내보냅니다. 같은 목적지로 가는 동시 연결이 게이트웨이의 포트 한도를 넘으면 새 연결이 실패합니다. (인프라팀·네트워크 인프라)
- 스위치 마이크로버스트: 여러 서버가 같은 순간 수천 명에게 패킷을 한꺼번에 보내면, 그 트래픽이 모이는 스위치 포트의 작은 버퍼가 1ms도 안 돼 넘칩니다. (게임개발팀·서버 개발)
L6 서버 네트워크 카드
- 링 버퍼 부족: NIC가 패킷을 잠시 담아 두는 링 버퍼가 작으면, 순간적으로 몰릴 때 버퍼가 넘쳐 패킷이 버려집니다. (인프라팀·서버 인프라)
- 클라우드 PPS 한도 초과: 클라우드 서버는 종류마다 초당 패킷 수·대역폭 한도가 있고 넘으면 조용히 버립니다. (인프라팀·서버 인프라)
L7 서버 OS (커널)
- OOM 킬러: 리눅스는 메모리가 바닥나면 메모리를 가장 많이 쓰는 프로세스를 골라 강제로 죽입니다. 대개 게임 서버입니다. (게임개발팀·서버 개발)
- 시스템 시계 점프 (NTP 스텝): 서버 시계가 한 번에 몇 초 앞뒤로 조정되면 시스템 시계에 의존하는 타이머가 한꺼번에 발동하거나 멈춥니다. (게임개발팀·서버 개발)
- 서버 간 연결의 임시 포트 고갈: 게임 서버가 DB나 다른 서버에 연결을 짧게 자주 맺고 끊으면, 끊긴 연결이 한동안 포트를 점유해 새 연결을 못 엽니다. (게임개발팀·서버 개발)
L8 소켓과 프로토콜
- 신뢰성 UDP 재전송 설정: UDP 위에 직접 만든 재전송 규칙이 너무 보수적이면 복구가 늦고 너무 공격적이면 회선을 더 막습니다. (게임개발팀·서버 개발)
L9 서버 게임 프로세스
- 메시지 큐 적체: 요청이 처리 속도보다 빨리 들어와 대기열에 쌓이면, 뒤쪽 요청은 몇 초 뒤에야 처리되거나 버려집니다. (게임개발팀·서버 개발)
- 서버 크래시: 처리하지 못한 오류로 서버 프로세스가 죽으면, 그 서버에 있던 모두의 접속이 동시에 끊깁니다. (게임개발팀·서버 개발)
- 패치로 트래픽 패턴이 바뀜: 새 콘텐츠·이펙트·동기화 항목이 패킷 크기와 빈도를 늘리면, 잘되던 서버가 패치 뒤부터 MTU·대역폭·패킷 수 한도에 걸립니다. (게임개발팀·서버 개발)
L11 디스크
- 디스크 가득 참: 로그와 덤프가 쌓여 디스크가 가득 차면 쓰기가 실패하고 대비가 없으면 서버가 죽습니다. (인프라팀·서버 인프라)
L12 데이터베이스
- 핫 로우 잠금 경합: 모두가 같은 행(길드 창고, 경매장 인기 아이템, 서버 전체 카운터)을 고치려 하면 한 명씩만 잠금을 얻습니다. (게임개발팀·서버 개발)
- DB 데드락: 두 트랜잭션(한 묶음으로 처리되는 DB 작업)이 서로 상대가 잠근 행을 기다리면 DB가 한쪽을 강제로 취소합니다. (게임개발팀·서버 개발)
- 복제 지연: 쓰기는 주 DB에, 읽기는 복제본에서 하는데 복제본이 늦게 따라오면 방금 쓴 내용이 안 보입니다. (인프라팀·DB 인프라)
- 대량 배치 작업: 랭킹 집계, 우편 일괄 발송, 오래된 데이터 정리를 운영 중에 돌리면 잠금과 디스크를 차지합니다. (게임개발팀·서버 개발)
- DB 장애 전환: 주 DB가 죽어 예비 DB로 전환되는 동안 쓰기가 안 되고 복제되지 못한 마지막 데이터는 사라질 수 있습니다. (인프라팀·DB 인프라)
- 긴 저장 주기로 인한 진행 유실: 부하를 줄이려 몇 분에 한 번만 저장하면, 그 사이 서버가 죽을 때 진행이 사라집니다. (게임개발팀·서버 개발)
- 오래 열린 트랜잭션: 트랜잭션 하나가 오래 열려 있으면 잠금을 계속 잡고 있고 DB가 옛 버전 데이터를 정리(purge)하지 못해 전체가 점점 느려집니다. (게임개발팀·서버 개발)
- 운영 중 스키마 변경(DDL) 잠금: 서비스 중에 테이블에 컬럼이나 인덱스를 추가하면, 잠깐 필요한 잠금 하나 때문에 그 테이블을 쓰는 모든 요청이 대기할 수 있습니다. (인프라팀·DB 인프라)
L13 서버 구성과 운영
- 부가 서버 장애: 채팅·파티·경매장처럼 게임 서버와 따로 도는 서버에 장애가 나면 그 기능만 동작하지 않습니다. (게임개발팀·서버 개발)
- 서버 간 시계 차이: 서버마다 시계가 조금씩 다르면 쿨타임·버프·이벤트 시작 판정이 서버마다 어긋납니다. (인프라팀·서버 인프라)
- 외부 서비스 의존: 플랫폼 로그인, 결제, 본인 인증 같은 외부 서비스가 느리거나 멈추면 그 단계에서 막힙니다. (외부·외부)
- 매치메이킹·리전 배정 오류: 가까운 리전 대신 먼 리전의 서버에 배정되면, 회선이 멀쩡해도 그 유저만 핑이 늘 높습니다. (게임개발팀·서버 개발)
- TLS 인증서 만료·설정 오류: 로그인·API·패치 서버의 인증서가 만료되거나 중간 인증서가 빠지면, 그 순간부터 새로 연결하는 클라이언트의 TLS 연결이 실패합니다. (인프라팀·네트워크 인프라)
동기화 설계
- 스킬 선입력 없음: 앞 스킬이 서버에서 끝났다는 확인을 받아야 다음 스킬을 누를 수 있으면, 연계마다 왕복 시간이 끼어듭니다. (게임개발팀·클라이언트 개발)
- 핑에 먹히는 짧은 판정 구간: 회피·패링·가드처럼 반응해야 하는 시간이 짧으면, 핑이 그 시간을 먹어 버려 피할 수 없는 공격이 생깁니다. (게임개발팀·서버 개발)
- 지연 보상 없는 판정: 서버가 “지금 서버에 있는 위치”로만 명중을 판정하면, 내가 본 화면과 판정이 어긋납니다. (게임개발팀·서버 개발)
- 지연 보상 과다: 공격자 기준으로 너무 멀리 되감아 주면, 맞는 쪽은 이미 숨었는데도 맞습니다. (게임개발팀·서버 개발)
- 클라이언트 권위: 각자 자기 결과를 결정하면 내 화면은 쾌적하지만 다른 사람 화면과 결과가 어긋나고 해킹에 약합니다. (게임개발팀·서버 개발)
- 너무 엄격한 서버 검증: 이동 속도·쿨타임·사거리를 서버가 너무 엄격하게 검사하면, 지터로 몰려 온 정상 입력까지 거절합니다. (게임개발팀·서버 개발)
- 선연출 뒤 서버 거절: 내 화면에서 먼저 보여 준 타격·스킬을 서버가 나중에 인정하지 않으면, 분명히 본 결과가 없던 일이 됩니다. (게임개발팀·클라이언트 개발)
- 낮은 스냅샷 전송률: 서버가 위치 업데이트(스냅샷)를 1초에 몇 번만 보내면 보간 버퍼를 그만큼 길게 잡아야 해서, 다른 캐릭터를 더 먼 과거로 봅니다. (게임개발팀·서버 개발)
일부에게만 생기는 문제
그림이 있는 원본 증상 사전 보기