본문 바로가기

개인공부/네트워크

Low Latency 최적화

 

 

기본적으로 TCP는 Nagle 알고리즘을 사용하여 작은 패킷들을 모아 하나의 큰 패킷으로 전송한다.

 

Nagle 알고리즘은 작은 크기의 데이터를 여러 번 전송하는 것보다 하나의 큰 패킷으로 묶어서 전송하는 방식이다. 이를 통해 다음과 같은 방식으로 동작합니다:

  • 작은 패킷이 보낼 때: TCP 연결에서 애플리케이션이 작은 데이터를 여러 번 전송하려고 할 경우, Nagle 알고리즘은 데이터를 모아서 큰 패킷으로 묶어 보낸다.
  • 버퍼가 채워질 때까지 대기: 작은 패킷을 보내는 대신, 이미 전송된 패킷에 대한 **ACK(확인 응답)**을 받기 전까지 새로운 패킷 전송을 대기한다. 또는 버퍼가 꽉 차면 전송을 진행한다.
  • 큰 패킷 전송: 큰 데이터가 전송되거나, ACK를 받은 후에는 대기하던 데이터를 한 번에 전송한다.

 

 

TCP_NODELAY 설정:

  • Nagle 알고리즘의 문제점:
    • 패킷을 모으는 동안 지연 시간이 발생.
    • 실시간 데이터 전송(예: 채팅, 게임)에는 부적합.
  • 해결 방법:

1. TCP_NODELAY 옵션을 사용해 Nagle 알고리즘을 비활성화.

  • 작은 패킷이라도 즉시 전송하도록 설정.

int flag = 1;

setsockopt(client_socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));

 

2. 스레드를 특정 CPU 코어에 고정하여 캐시 효율성을 높이고 컨텍스트 스위칭 오버헤드를 줄입니다.

    • 멀티코어 환경에서 성능 최적화에 매우 유용.CPU 코어 고정:

cpu_set_t cpuset;

CPU_ZERO(&cpuset);

CPU_SET(2, &cpuset); // 2번 코어에 고정

pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);