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

게임 렉 백서 › L10 메모리

스왑 Swapping

원인 ID mem-swap · 주 담당 인프라팀·서버 인프라 · 함께 게임개발팀·서버 개발

그림과 실험이 있는 원본 카드로 열기 →

메모리가 모자라 OS가 일부를 디스크로 내보내면, 그 메모리를 쓸 때마다 1,000배 넘게 느린 디스크를 기다립니다.

왜 사용 메모리가 실제 램을 넘음 → 그러면 OS가 일부를 디스크로 내보내고 필요할 때 다시 읽음 → 화면에서는 틱이 수백 ms로 폭증해 서버의 모든 유저가 슬로우모션·멈춤

증상
슬로우모션, 멈춤
요인
정체
누가 겪나
서버 전체
언제
오래 켜 둘수록, 저녁 피크 시간
담당
주 담당 인프라팀·서버 인프라 · 함께 게임개발팀·서버 개발
게임개발팀 할 일
프로세스 메모리 사용량에 상한(힙 크기 등)을 두고 누수 점검.
인프라팀 할 일
게임 서버는 스왑을 쓰지 않도록 설정, 메모리 경보로 대응, 스왑을 끄면 메모리가 모자라는 순간 강제 종료(OOM)되므로 피크 사용량보다 램을 넉넉히 확보.
수치 감각
RAM 읽기 약 100ns, SSD에서 되읽기 약 100µs(1,000배), 네트워크 너머 클라우드 디스크는 약 1ms(1만 배), HDD는 10ms(10만 배).
그래프에서는
서서히 오름 · 스왑 사용량, 스왑 인·아웃
확인할 곳
vmstat 1의 si·so 열(초당 스왑에서 읽어 들인·내보낸 양), /proc/pressure/memory의 some·full(메모리를 기다리느라 멈춘 시간 비율), 게임 서버 프로세스의 pidstat -r majflt/s(디스크에서 읽어 와야 했던 페이지 폴트)를 틱 시간과 겹쳐 봄
이러면 맞음
렉 시각에 si가 0보다 크고 게임 서버의 majflt/s와 memory의 full 값이 함께 오름
이러면 아님
si·so가 0이고 memory 압박(PSI)도 0 근처면 스왑이 원인이 아님. 스왑이 없는데 majflt/s와 PSI가 오르면 메모리가 바닥나 코드 페이지를 다시 읽는 상태라 메모리 확보가 먼저
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
GC를 쓰는 서버는 수집할 때 힙 곳곳을 읽기 때문에, 힙 일부만 스왑돼도 GC 한 번이 수 초~수십 초로 늘어날 수 있습니다. 스왑을 끄면 스왑 때문에 느려지는 단계 없이 강제 종료(OOM)로 넘어가므로, 여유 메모리를 먼저 확보해야 합니다. 스왑이 없어도 메모리가 바닥에 가까우면 OS가 실행 파일의 코드 페이지까지 메모리에서 내렸다가 다시 읽느라, 강제 종료 전에 한동안 서버 전체가 심하게 느려질 수 있습니다.

출처

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    “Numbers Everyone Should Know”: 메인 메모리 참조 100ns, 디스크 탐색 10ms(2009년 기준)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness: 스왑과 파일 페이지 회수의 상대 비용, 스왑은 무작위 I/O라 비쌈
  3. Concepts overview Linux kernel
    디스크에 원본이 있는 페이지 캐시와 스왑 가능한 페이지를 회수하고 그래도 모자라면 OOM 킬러가 프로세스를 죽임
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    서버용 NVMe SSD의 99.99% 지연(four-nines latency) 130µs: SSD 한 번 읽기가 100µs 안팎이라는 근거
  5. Amazon EBS General Purpose SSD volumes AWS
    클라우드 기본 디스크(gp3)의 지연은 한 자릿수 ms
  6. vmstat(8) — Linux manual page procps-ng
    si: 초당 스왑에서 읽어 들인 메모리, so: 초당 스왑으로 내보낸 메모리
  7. PSI - Pressure Stall Information Linux kernel
    /proc/pressure/memory의 some(일부 작업이 멈춘 시간 비율)과 full(모든 작업이 동시에 멈춘 시간 비율)
  8. pidstat(1) — Linux manual page sysstat
    -r: majflt/s(디스크에서 페이지를 읽어 와야 했던 폴트 수)

함께 보면 좋은 원인

같은 층: L10 메모리

같은 증상(슬로우모션)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기