과다 트래픽
현재 인디 게임을 클라우드 플랫폼에서 호스팅하고 있는 중인데, 여러 명의 사용자가 30분 이상 플레이하다보면 뚝뚝 끊긴다라는 제보가 있어서
관련 문제를 해결하기 위한 과정을 해당 게시글에 써보려고 한다.
현재 서버에는 아래와 같이 총 2명의 유저가 접속 중이다.
현재 네트워크 트래픽의 부하가 어느 정도인지 확인해 보기 위해 iftop
를 설치하자.
sudo apt-get install -y iftop net-tools
서버의 ens5 포트로 트래픽이 유입되고 있으니 해당 포트를 모니터링 해보자.
sudo iftop -i ens5
지금은 네트워크 트래픽이 안정적이지만 사용자가 늘거나 특정 몹 개체수가 늘어나는 경우 트래픽 부하가 심각하게 올라간다.
해결 방법
- 네트워크 인터페이스 최적화
- 네트워크 인터페이스의 설정을 최적화하여 대역폭, 전송률 및 연결 안정성을 향상시킬 수 있습니다. 이를 위해 ethtool과 같은 도구를 사용하여 네트워크 카드의 속성을 확인하고 조정할 수 있습니다.
- QoS(Quality of Service) 구성
- QoS를 사용하여 중요한 트래픽에 대한 우선 순위를 설정할 수 있습니다. 이를 통해 실시간 응용 프로그램 및 서비스에 대한 대역폭을 보장할 수 있습니다.
- 파이어월 및 보안 설정
- 보안 정책 및 방화벽 설정을 검토하여 불필요한 트래픽이 네트워크를 혼잡시키지 않도록 합니다.
- TCP/IP 스택 튜닝
- TCP/IP 스택의 파라미터를 조정하여 네트워크 성능을 최적화할 수 있습니다. 이를 통해 대역폭 사용률을 최적화하고 핑을 개선할 수 있습니다.
- 네트워크 트래픽 모니터링 및 분석
- 네트워크 트래픽을 지속적으로 모니터링하고 분석하여 병목 현상이나 문제를 식별하고 해결할 수 있습니다. 이를 위해 iftop, nload, Wireshark와 같은 도구를 사용할 수 있습니다.
- CDN(Content Delivery Network) 사용
- CDN을 통해 정적 콘텐츠를 캐시하여 웹 서버에 가해지는 부하를 줄이고 네트워크 성능을 향상시킬 수 있습니다.
- 네트워크 가상화 및 컨테이너화
- 가상화 기술을 사용하여 네트워크 자원을 효율적으로 활용하고 성능을 최적화할 수 있습니다. 이를 위해 Docker, Kubernetes 등의 컨테이너 관리 플랫폼을 활용할 수 있습니다.
- 테스트 및 최적화
- 다양한 설정 및 조치를 테스트하고 성능을 평가하여 최적화된 네트워크 환경을 구축할 수 있습니다.
1. TCP/IP 스택 조정
그 중에서 가장 간단하고 효과적인 방법 중 하나는 TCP/IP 스택 파라미터를 조정하여 네트워크 성능을 최적화하는 것이다.
이를 통해 대역폭 사용률을 최적화하고 핑을 개선할 수 있다.
Ubuntu 22.04에서 TCP/IP 스택을 튜닝하는 방법은 아래와 같다.
1. TCP/IP 파라미터 확인
먼저 현재 TCP/IP 파라미터 값을 확인한다. 이를 위해 sysctl
명령을 사용함.
sysctl -a | grep 'tcp'
이 명령을 통해 현재의 TCP/IP 파라미터 값들을 확인할 수 있다.
2. 파라미터 조정
sysctl
을 사용하여 파라미터 값을 조정하자.
다음과 같은 명령을 사용하여 TCP/IP 파라미터를 조정할 수 있다.
sudo sysctl -w net.ipv4.tcp_window_scaling=1
sudo sysctl -w net.ipv4.tcp_timestamps=1
sudo sysctl -w net.ipv4.tcp_sack=1
이는 TCP 윈도우 스케일링, TCP 타임스탬프, TCP 선택적 확인 요청을 활성화하는 것으로, 이러한 기능을 통해 TCP/IP 성능을 향상시킬 수 있다.
각 명령어의 자세한 내용은 아래와 같다.
sudo sysctl -w net.ipv4.tcp_window_scaling=1
- net.ipv4.tcp_window_scaling: TCP 윈도우 스케일링 기능을 활성화하는 데 사용되는 파라미터입니다. TCP 윈도우 스케일링은 TCP 흐름 제어에서 사용되며, 대역폭이 높고 네트워크 레이턴시가 낮은 환경에서 성능을 향상시키는 데 도움이 됩니다.
- 이 기능을 활성화하면 TCP 윈도우 크기를 더 유연하게 조정하여 대역폭을 최대한 활용할 수 있습니다.
sudo sysctl -w net.ipv4.tcp_timestamps=1
- net.ipv4.tcp_timestamps: TCP 타임스탬프 옵션을 활성화하는 데 사용되는 파라미터입니다.
- TCP 타임스탬프는 네트워크 딜레이와 패킷 손실을 감지하는 데 도움이 되며, 특히 높은 대역폭 환경에서 TCP 연결을 더욱 효율적으로 관리할 수 있도록 합니다.
sudo sysctl -w net.ipv4.tcp_sack=1
- net.ipv4.tcp_sack: TCP 선택적 확인 요청(SACK) 옵션을 활성화하는 데 사용되는 파라미터입니다.
- TCP SACK는 패킷 손실을 관리하기 위한 기술로, 패킷 손실이 발생한 경우에도 효율적으로 데이터 전송을 계속할 수 있도록 도와줍니다. 이 옵션을 활성화하면 네트워크 성능이 향상될 수 있습니다.
3. 변경 내용 유지
변경한 TCP/IP 파라미터를 영구적으로 유지하려면 /etc/sysctl.conf 파일을 수정하여 해당 값들을 추가해야 한다.
sudo vim /etc/sysctl.conf
# 그리고 아래 내용을 추가
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_sack=1
4. 변경 내용 적용
sudo sysctl -p
2. TCP BBR
구글에서 TCP 통신의 속도 개선 및 안정성 향상을 위해 개발한 혼잡제어 알고리즘이다.
현재에는 유튜브와 구글 클라우드에 적용되어 있다고 한다.
자세한 내용은 아래 링크를 참고해보도록 하자.
https://cloud.google.com/blog/products/networking/tcp-bbr-congestion-control-comes-to-gcp-your-internet-just-got-faster?hl=en
2-1. 제한 사항
적용할 서버에 접속하여 커널 버전 확인
$ uname -r
6.2.0-1018-aws
💥 커널 버전이 4.9 이상인 환경에서만 적용 가능
2-2. BBR 적용
/etc/sysctl.conf
파일을 편집
2-3. 현재 리눅스 커널 설정 확인
$ cat /boot/config-$(uname -r) | egrep 'CONFIG_TCP_CONG_BBR|CONFIG_NET_SCH_FQ'
CONFIG_TCP_CONG_BBR=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m
CONFIG_NET_SCH_FQ_PIE=m
2-4. 현재 시스템에 적용된 TCP 혼잡 제어 알고리즘 확인 (cubic)
$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic
cubic
이 적용되어 있음.
2-5. BBR을 적용하기 위해 /etc/sysctl.conf
파일에 아래 내용을 추가
#### 아래 내용 추가
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
2-6. 변경 내용 적용하기
$ sudo sysctl -p
2-7. 정상적으로 적용되었는지 확인
$ sudo sysctl -a | egrep 'bbr|fq'
아래와 같이 나오면 성공.
net.core.default_qdisc = fq
net.ipv4.tcp_allowed_congestion_control = reno cubic bbr
net.ipv4.tcp_available_congestion_control = reno cubic bbr
net.ipv4.tcp_congestion_control = bbr