본문 바로가기

CS

[네트워크] HOL(Head Of Line) blocking


정의

 패킷 라인이 첫번째 패킷에 의해 대기열로 보류될 때 발생하는 성능 저하를 의미한다. 특정 프로토콜이나 기술에 국한된 개념이 아니며, 순서를 보장하는 서비스나 자원의 경합 등 특정 패킷의 대기가 다른 패킷의 움직임을 막는 경우 HOL blocking에 속할 수 있다.


네트워크 스위치

HOL blocking on network switch ( wikipedia )

입력 큐에 속한 패킷들이 하나의 출력 큐를 두고 경합하는 과정에서 단 하나의 큐 데이터만 전송되고, 다른 큐의 데이터들은 그만큼 대기하는 비효율이 발생할 수 있다. 만약 경합이 없었다면 모든 첫번째 큐의 데이터가 적절한 출력 포트로 이동하므로 다음 패킷들은 각 큐의 첫번째 패킷에 의한 대기(차단) 없이 다음 턴에 처리될 수 있을 것이다.

 위 그림에서 1번 큐와 3번 큐의 첫번째 패킷은 출력 포트 4에 대해 경합한다. 이때 각 출력 포트는 결국 한번에 하나의 패킷만 이동할 수 있으므로, 1번 또는 3번 큐의 첫번째 패킷은 이번 턴에 처리되지 못한다. 이때 1번 큐의 첫번째 패킷이 이동했다고 하자. 이 경우 3번 입력 포트에 있는 패킷들 입장에서는 자신이 속한 큐의 첫번째 패킷이 처리되지 않아 대기해야 하는 비효율을 겪게 된다. 즉, 3번 큐의 패킷들은 HOL blocking을 겪는다.

 위와 같은 문제는 출력 큐를 두는 등의 방법을 통해 처리할 수 있다.

HTTP/1.1 pipelining

https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x

 pipelining은 HTTP 1.1 버전에 도입된 기술로, 현재 요청에 대한 응답을 받은 후 다음 요청을 보낼 수 있는 기존 방식과는 달리 응답을 기다리지 않고 연속하여 요청을 보내는 방법이다. 처음 도입 시기에는 각 커넥션에 대한 지연시간을 줄일 수 있을 것으로 기대했으나, 구현 및 예상이 어려우면서 실제 성능 향상은 높지 않아 실제로는 브라우저 수준에서도 지원하지 않는 경우가 많다.

pipelining을 설명하는 그림

 HOL blocking이 발생하는 것도 큰 문제점이다. 요청을 한번에 많이 보낼 수 있는 것까지는 좋은데, 요청에 대한 응답의 경우 요청한 순서대로만 받을 수 있다. 따라서 처음에 수행한 요청에 대한 응답이 여러 이유로 늦게 되면, 나중에 보낸 요청에 대한 응답이 아무리 빠르게 도착하더라도 수용할 수 없다.

 이런 이유들로 인해 파이프라이닝은 실제로 거의 사용되지 않으며, HTTP/2에서는 파이프라이닝에서 발생하는 HTTP 패킷에 대한 HOL blocking 문제를 회피하기 위해 한 커넥션 안에 여러개의 가상 흐름을 두는 스트림 방식을 채택한다.

Out-of-order delivery

 TCP 등 전송 순서를 보장하는 프로토콜은 앞 번호의 패킷이 도착하지 않은 경우 정책에 따라 뒷 번호의 패킷을 버려서 재전송을 유도하거나(go-back-N), 뒷 패킷들에 대한 큐를 운용하며 대상 패킷이 도착하기를 기다린다(selective-repeat). 이러한 문제는 패킷이 이동하는 네트워크 경로 차이 또는 패킷 손실로 인한 재전송 등에 의해 발생할 수 있다.

 요점은 전송 순서를 보장하기 위해 뒷 번호의 패킷들이 앞 번호의 패킷의 도착을 기다리는 비효율적 대기가 발생한다는 점으로, 앞서 설명한 HOL blocking에 해당한다.

HTTP/2는 HTTP/1.1의 pipelining에서 발생하는 HTTP 패킷(메시지) 순서 보장 문제를 하나의 커넥션 내에 가상의 회선인 stream을 여러개 두고, 서로 독립적으로 동작할 수 있게 구성함으로써 해결했으나. TCP 기반으로 동작하는 특성상 TCP가 TCP 패킷(세그먼트)의 순서를 보장하는 과정에서 발생하는 HOL blocking 문제는 해결할 수 없다. HTTP/3은 순서를 보장하지 않는 프로토콜인 UDP와 TLS 1.3 버전을 조합하여 사용함으로써 이 문제를 회피한다.

'CS' 카테고리의 다른 글

[CS] DIP / IoC / DI  (0) 2023.10.23
[CS] 객체 지향  (0) 2023.10.18
[batch] cron 표현식  (0) 2023.08.23
[암호학] 서론  (0) 2022.09.16
[CS] 프로세스(process) 내용 정리  (0) 2021.11.08