들어가며

이 포스팅은 구글 엔지니어에게 듣는 네트워킹과 웹 성능 최적화 기법 의 1장을 요약한 것입니다.

레이턴시와 대역폭

웹 성능을 최적화하기 위해서는, 이 두 가지에 대한 이해가 필수불가결하다.

  • 레이턴시 : 패킷을 전송하는 곳에서부터 받는 곳까지 이동하는 데 걸리는 시간
  • 대역폭 : 논리적인, 혹은 물리적인 통신 경로의 최대 처리량

레이턴시와 대역폭이 어떤 식으로 함께 동작하는지를 이해하고 나면, TCP와 UDP, 그리고 그 위에 올라가는 모든 애플리케이션 프로토콜의 내부를 들여댜 볼 것이며 그 성능을 이해하는데 큰 도움이 될 것이다.

레이턴시의 구성 요소

레이턴시는 메시지나 패킷이 출발점에서 도착점까지 이동하는데 걸리는 시간을 말한다. 이 정의는 유용하지만, 내부에 많은 유용한 정보를 감추고 있다. 우선, 인터넷 환경의 라우터에서 클라이언트와 서버 간 메시지를 주고받을 때 레이턴시를 일으키는 요소가 무엇인지 자세히 살펴보자

  • 전파 지연: 메시지가 송신 측에서 수신측까지 이동하는 데 걸리는 시간
  • 전송 지연: 링크로 패킷의 모든 비트를 내보내는 데 걸리는 시간
  • 프로세싱 지연: 패킷 해더를 처리하고 비트 수준의 에러를 체크하고 패킷의 목적지를 알아내는 데 필요한 시간
  • 큐잉 지연: 패킷이 처리될 때까지 큐에서 대기하는 시간

위에 기술된 네 가지 지연을 합친 것이, 클라이언트와 서버 간의 총 레이턴시이다.

전파 지연은 메체에 따라 달라진다. 보통 빛의 속도에서 크게 벗어나지 않는다.

반면에 전송 지연은 전송 링크의 데이터 전송률에 좌우되며, 클라이언트와 서버 간의 거리와는 아무런 상관이 없다. 예를 들어, 1Mps와 100Mps 두가지 링크를 사용하여 10Mb의 파일을 전송한다고 가정하면, 1Mps를 사용하면 10초가 걸리지만 100Mps를 사용하면 0.1초밖에 걸리지 않는다.

그 후 패킷이 라우터에 도착하면, 다음 발송지 루트를 알아내고 데이터를 체크하기 위해 패킷 헤더를 살펴봐야 한다. 이 모든 작업은 하드웨어에서 일어나기 때문에, 지연시간은 매우 적지만 존재는 한다. 이를 프로세싱 지연이라 한다.

마지막으로, 패킷이 라우터가 한번에 처리할 수 있는 속도보다 더 빠른 속도로 도착한다면 그 패킷들은 인커밍 버퍼 안에서 대기하게 된다. 데이터가 이 버퍼 안에서 보내는 시간이 바로 큐잉 지연이다.

빛의 속도와 전파 지연

빛의 속도는 매우 빠르다. 초당 299,792,458 미터에 이른다. 그러나 보통 패킷을 전송할 때 사용하는 매체는 구리선 혹은 광섬유 케이블이기 때문에, 패킷의 속도는 느려지게 된다. 빛의 속도 대비 특정 물질 안에서 패킷이 이동하는 속도를 측정한 것을 굴절률이라고 하는데, 이 값이 클수록 해당 물질 안에서 빛이 이동하는 속도는 감소한다.

광섬유의 보편적인 굴절율은 1.4에서 1.6 사이이고, 이 의미는 광섬유 안에서 빛의 속도는 초당 약 2억 미터라는 의미이다.

빛의 속도는 빠르지만, 뉴욕에서 시드니까지 왕복에만 160밀리초가 걸린다. 다만 이 값도 뉴욕 - 시드니를 바로 연결하는 광섬유가 있다는 가정 하에 세워진 값이므로, 실제로는 훨씬 긴 루트를 통해 이동하게 될 것이다.

패킷이 이동하면서 경로를 갈아탈 때마다, 앞에서 설명한 라우팅, 프로세싱, 큐잉, 전송 지연을 얻게 된다. 결과적으로 뉴욕 - 시드니를 왕복하는 데는 200 - 300밀리초가 걸린다.

최종 마일 레이턴시

그러나 생각보다 위의 과정에서 레이턴시가 많이 발생하지는 않는다. 얄궂게도, 대부분의 레이턴시가 발생하는 곳은 바다나 대륙을 건너는 도중이 아니라, 마지막 몇 킬로미터 지점에서 발생한다. 집이나 사무실을 인터넷에 연결하기 위해서는, 각 지역에 케이블을 설치하고 신호를 취합하여 로컬 라우팅 로드로 넘겨주어야 한다.

이 과정에서, 사용 기술/연결 방식/라우팅 방법 등에 따라 메인 라우터에 도달하는 데 수십 밀리초가 발생할 수 있다.

높은 대역폭과 낮은 레이턴시

당연한 이야기지만, 대역폭을 늘리는 것은 경제적인 문제와 연관되어 있다. 기술의 발달이 힘들다면 광섬유 링크의 수를 늘리는 것 만으로 대역폭을 늘릴 수 있다.

그러나 레이턴시를 낮추는 것은 완전히 다른 문제이다. 광섬유 링크의 질을 높이면, 좀 더 빛의 속도에 가까이 갈 수 있을 것이다. 그러나 현재 우리에게 주어진 속도가 빛의 -1.5 이내라는 것을 고려해 보면, 잘해봐야 30% 이상 속도를 향상시킬 수 없다. 우리는 물리 법칙을 거스를 수 없는 것이다.

그러면 어떻게 하면 레이턴시를 낮출 수 있을까? 이동 거리를 줄이는 방법을 고려해 볼 수 있을 것이다. 그러나 이것 또한 항상 최단거리에 케이블을 놓을 수는 없을 것이다.

결과적으로 우리는 프로토콜과 네트워킹 코드를 설계/최적화하여 대역폭을 향상시키고 레이턴시를 낮추어야 한다. 왕복 거리를 줄이고, 클라이언트와 가까운 곳에 데이터를 위치시키고, 레이턴시를 감추기 위해 캐싱, 프리페칭 등 여러 기술을 도입해야 한다.