사전 지터
개념

지터

gabury1고친 사람 github-actions[bot]

지터는 일정해야 할 간격이 얼마나 들쭉날쭉한지를 나타냅니다. 같은 간격으로 내보낸 패킷이 어떤 것은 곧바로 닿고 어떤 것은 한참 뒤에 닿으면 그 경로는 지터가 큽니다. 네트워크에서는 줄이려고 이 값을 잽니다. 여러 대가 같은 순간에 몰리는 것을 막을 때는 일부러 섞어 넣기도 합니다.

쉽고 빠른 이해

지터는 간격이 고르지 않은 정도를 한 값으로 나타냅니다. 인터넷 전화에서 목소리가 뚝뚝 끊기면 그 통화는 지터가 큰 것입니다. 소리와 영상은 지터에 민감하고 파일 내려받기는 둔합니다.

평균만 보면 멀쩡해 보이는 경로가 못 쓸 수 있습니다. 평균 지연이 같아도 도착이 들쭉날쭉하면 소리와 영상은 끊깁니다. 지터는 평균이 못 보여 주는 이 흔들림을 잡아냅니다.

어떻게 도는가:

  1. 보낸 간격과 받은 간격이 얼마나 어긋났는지를 잽니다
  2. 받는 쪽은 조각(패킷)을 조금 쌓아 두었다가 고른 간격으로 꺼내 씁니다
  3. 거꾸로 여럿이 같은 순간에 움직이는 것을 막고 싶을 때는 기다리는 시간에 무작위 값을 섞습니다

대가가 있습니다. 쌓아 두는 만큼 소리와 영상이 늦게 나옵니다. 무작위 값을 섞으면 언제 돌아올지 미리 잡을 수 없습니다.

상세

지하철 안내판이 3분 간격으로 온다고 적어 두었습니다. 그런데 어느 날은 1분 만에 오고 어느 날은 7분을 기다립니다. 평균은 여전히 3분이지만 승강장에 선 사람은 다음 차가 언제 올지 정하지 못합니다.

지터는 이렇게 일정해야 할 간격이 매번 달라지는 흔들림입니다. 그 흔들림의 크기를 재는 값이기도 합니다. 네트워크에서는 패킷이 도착하는 간격이 흔들리는 정도를 뜻합니다. 여러 대가 함께 도는 시스템에서는 기다리는 시간에 일부러 섞어 넣는 무작위 값을 뜻합니다.

두 쓰임은 반대로 보이지만 재는 것은 하나입니다. 간격이 고른가, 흩어졌는가입니다.

재는 방법도 단순합니다. 보낸 쪽은 고른 간격으로 패킷을 내보냅니다. 받은 쪽에서는 이웃한 두 패킷의 도착 간격이 그 간격과 얼마나 어긋났는지를 매번 잽니다. 그 어긋남을 여러 번 모아 하나의 값으로 삼습니다.

block-beta
columns 7
  t["보낸 쪽"]:1 a["간격"]:2 b["간격"]:2 c["간격"]:2
  r["받은 쪽"]:1 d["간격"]:1 e["간격"]:3 f["간격"]:2

윗줄은 칸 폭이 모두 같습니다. 아랫줄은 어떤 칸은 좁고 어떤 칸은 넓습니다. 이 폭 차이가 지터가 재는 대상입니다. 한 번만 크게 늦은 경로보다 내내 들쭉날쭉한 경로가 큰 값으로 나옵니다.

네트워크에서 재는 흔들림

먼저 네트워크 쪽 뜻입니다. 이 뜻에서 지터는 줄여야 하는 값입니다. 지연·대역폭·패킷 손실과 나란히 놓고 경로의 품질을 판정합니다.

흔들림은 대개 중간 장비의 큐에서 생깁니다. 길이 붐비면 패킷은 큐에 쌓여 순서를 기다립니다. 기다린 시간은 큐가 얼마나 차 있었느냐에 따라 달라집니다. 앞 패킷은 텅 빈 큐를 만나고 뒤 패킷은 꽉 찬 큐를 만나면 둘의 도착 간격이 벌어집니다.

flowchart TD
    subgraph 앞["앞 패킷"]
        A1["텅 빈 큐를 만난다"] --> A2["곧바로 빠져나간다"]
    end
    subgraph 뒤["뒤 패킷"]
        B1["꽉 찬 큐를 만난다"] --> B2["앞의 것들이 빠질 때까지 기다린다"]
    end
    앞 --> C["두 패킷의 도착 간격이 벌어진다"]
    뒤 --> C

같은 경로를 지나도 큐에 얼마나 쌓여 있었느냐에 따라 기다린 시간이 달라집니다. 그 차이가 그대로 도착 간격의 흔들림이 됩니다.

경로가 바뀌거나 잃어버린 패킷을 재전송하는 것도 같은 결과를 냅니다. 새 경로가 조금 더 길거나 다시 보낸 패킷이 한 왕복 늦게 닿으면, 그때만 간격이 툭 튑니다.

평균 지연이 낮아도 지터가 크면 실시간 전송은 망가집니다. 소리와 영상은 정해진 간격으로 이어 붙여야 사람이 알아들을 수 있습니다. 패킷이 늦게 오면 그 대목이 비어 소리가 끊깁니다. 파일을 내려받는 일은 패킷이 늦게 와도 나중에 순서만 맞추면 되므로 지터에 둔합니다.

그래서 받는 쪽은 도착한 패킷을 곧바로 쓰지 않고 조금 쌓아 둡니다. 이렇게 쌓아 두는 버퍼를 지터 버퍼라고 합니다. 늦게 온 패킷이 버퍼에 남은 분량 안에 들어오면 재생은 끊기지 않습니다.

flowchart TD
    A["보낸 쪽 · 고른 간격으로 내보낸다"] --> B["중간 큐 · 어떤 패킷은 오래 기다린다"]
    B --> C["받은 쪽 · 도착 간격이 들쭉날쭉하다"]
    C --> D["지터 버퍼 · 조금 쌓아 두고 기다린다"]
    D --> E["재생 · 다시 고른 간격이 된다"]

그림은 흔들림이 어디서 생기고 어디서 사라지는지를 보입니다. 큐에서 생긴 흔들림은 버퍼가 받아 냅니다. 재생은 그 대가로 한 박자 늦게 시작됩니다.

버퍼를 키우면 끊김이 줄고 지연이 늘어납니다. 버퍼 크기는 지터를 얼마나 견딜지와 얼마나 늦게 들려줄지를 맞바꾸는 선택입니다.

일부러 섞어 넣는 흔들림

이제 반대쪽 뜻입니다. 여러 대가 함께 도는 시스템에서 지터는 재는 값이 아니라 집어넣는 값입니다.

서버 하나가 잠깐 멈추면 그 서버를 부르던 클라이언트가 한꺼번에 실패합니다. 모두 같은 규칙으로 기다렸다가 재시도하면 다시 같은 순간에 몰려옵니다. 겨우 일어난 서버가 그 덩어리에 또 눌립니다. 이렇게 여럿이 같은 순간에 깨어나 한꺼번에 덤비는 것을 썬더링 허드라고 합니다.

기다리는 시간에 무작위 값을 섞으면 각자가 조금씩 다른 때에 돌아옵니다. 이 무작위 값이 지터입니다. 요청이 시간축 위에 퍼지면서 한 순간에 솟던 봉우리가 낮아집니다.

flowchart TD
    A["서버가 잠깐 멈춘다"] --> B["클라이언트가 한꺼번에 실패한다"]
    B --> C["다들 기다렸다가 재시도한다"]
    C -->|"같은 시간을 기다리면"| D["같은 순간에 한꺼번에 몰린다"]
    D -->|"서버가 다시 눌린다"| A
    C -->|"무작위 값을 섞으면"| E["저마다 다른 때에 돌아온다"]
    E --> F["서버가 견딘다"]

위쪽 고리가 몰림입니다. 같은 시간을 기다린 탓에 재시도가 서버를 다시 눕힙니다. 눕힌 서버가 또 같은 실패를 만듭니다. 무작위 값을 섞는 갈래가 이 고리를 끊습니다.

지수 백오프는 실패가 이어질수록 기다리는 시간을 늘리는 방법입니다. 거기에 지터를 얹으면 대기 시간을 정하는 줄이 이렇게 갈립니다.

Python
wait = backoff              # 모두 같은 때
wait = uniform(0, backoff)  # 서로 다른 때

uniform 은 두 값 사이에서 아무 수나 하나 뽑는 함수입니다. 위쪽은 모두가 같은 시각 하나를 가리킵니다. 아래쪽은 0과 backoff 사이 어딘가를 가리키므로 클라이언트마다 값이 달라집니다. 줄 하나 차이로 몰림이 흩어집니다.

다만 지터는 몰리는 순간을 흩을 뿐 요청의 총량을 줄이지는 않습니다. 재시도가 다시 실패를 불러 부하가 불어나는 것을 재시도 폭풍이라고 합니다. 이미 버틸 수 없는 양이 오고 있다면 지터만으로는 그치지 않습니다.

그래서 총량을 누르는 장치가 따로 필요합니다. 재시도 횟수에 상한을 두면 한 클라이언트가 끝없이 두드리지 못합니다. 서킷 브레이커는 실패가 이어지면 호출을 아예 끊어 두었다가 나중에 다시 열어 봅니다.

같은 수법을 주기 작업에도 씁니다. 여러 대가 정각마다 같은 일을 하도록 짜면 매 정각에 부하가 솟습니다. 시작 시각에 무작위 값을 조금 섞으면 그 봉우리가 평평해집니다.

캐시가 만료되는 시각을 조금씩 어긋나게 두는 것도 같은 생각입니다. 만료된 순간 여럿이 한꺼번에 원본을 치러 가는 캐시 스탬피드를 이렇게 막습니다.

두 쓰임을 가르는 선

지금까지 본 두 뜻을 한 표로 맞세우면 이렇습니다.

네트워크의 지터 재시도의 지터
누가 만드나 경로와 큐가 저절로 만든다 코드가 일부러 넣는다
어느 방향으로 미나 작게 눌러 둔다 일부러 키운다
무엇에 쓰나 재서 경로 품질을 판정한다 몰리는 순간을 흩는다
대가 버퍼로 견디면 늦게 들린다 언제 돌아올지 못 잡는다

같은 낱말을 쓰는 까닭은 재는 대상이 같기 때문입니다. 둘 다 간격이 고른지 흩어졌는지를 말합니다. 문장에서 지터를 만나면 줄이려는 쪽인지 넣으려는 쪽인지부터 보면 뜻이 갈립니다.

관련 항목

지터와 나란히 네트워크를 재는 지표

지연 · 대역폭 · 처리량 · 왕복 시간 · 패킷 손실 · 꼬리 지연

네트워크에서 지터를 만드는 원인

혼잡 · 큐잉 지연 · 버퍼 블로트 · 재전송 · 경로 변경 · 헤드 오브 라인 블로킹 · 순서 뒤바뀜

지터를 흡수하거나 줄이는 장치

지터 버퍼 · 버퍼 · 혼잡 제어 · 트래픽 셰이핑 · 서비스 품질

지터에 민감한 실시간 전송 기술

RTP · WebRTC · VoIP · UDP · QUIC · 스트리밍 · 패킷

지터를 일부러 섞는 대기 전략

백오프 · 지수 백오프 · 재시도 · 타임아웃 · 재시도 예산

지터로 흩뜨려 막는 몰림 장애

썬더링 허드 · 재시도 폭풍 · 캐시 스탬피드 · 라이브락 · 연쇄 장애 · 서킷 브레이커

지터를 품질 잣대로 쓰는 시각 동기화

NTP · 오프셋 · 시계 보정 · 클럭 드리프트

다른 이름: jitter · 흔들림