게임 렉 백서 › L10 메모리
캐시 미스 CPU cache misses
원인 ID mem-cache-miss · 주 담당 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
데이터가 메모리 여기저기 흩어져 있으면 CPU가 매번 느린 RAM까지 가서 기다립니다.
왜 객체가 포인터로 흩어져 있고 순서 없이 접근 → 그러면 CPU 캐시에 없어서 매번 RAM에서 읽음(100배 안팎 느림) → 화면에서는 같은 일을 해도 틱 비용이 몇 배, 심하면 슬로우모션
- 증상
- 슬로우모션
- 요인
- 정체
- 누가 겪나
- 서버 전체
- 언제
- 항상, 사람이 몰릴 때
- 담당
- 주 담당 게임개발팀·서버 개발
- 게임개발팀 할 일
- 자주 함께 쓰는 데이터를 연속으로 배치(데이터 지향 설계).
- 그래프에서는
- 처음부터 늘 높음 · 틱 시간, CPU 사용률
- 확인할 곳
- 게임 서버 프로세스에 perf stat -d -p PID를 걸어 사이클당 명령어 수(insn per cycle)와 L1·LLC 캐시 미스를 재고, 틱 시간·CPU 사용률과 함께 봄
- 이러면 맞음
- CPU를 계속 바쁘게 쓰는데 insn per cycle이 낮고 LLC 미스가 많음. 데이터 배치를 바꾼 빌드에서 같은 인원의 틱 시간이 크게 줄면 확정
- 이러면 아님
- CPU 사용률이 낮은데 틱이 느리면 락·I/O 대기처럼 CPU 밖에서 기다리는 원인
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
L1 캐시 0.5ns, L2 캐시 7ns, 메인 메모리 100ns(2009년 기준): RAM까지 가면 캐시보다 한두 자릿수 느림 - perf-stat(1) — Linux manual page perf
-p로 실행 중인 프로세스의 하드웨어 이벤트를 세고 insn per cycle을 보여 줌, -d는 L1·LLC 데이터 캐시 이벤트를 더함
함께 보면 좋은 원인
같은 층: L10 메모리
같은 증상(슬로우모션)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기