WiFi 통신 딜레이 줄이기
실시간 원격 통신이 필수인 환경(ROS2 기반 자율주행 스택)에서는 기본 OS 설정만으로 통신 지연(latency)과 ping 스파이크가 발생할 수 있으며, 아래 두 가지 세팅으로 통신 안정성을 향상시킬 수 있습니다.
- 메모리 버퍼 늘리기 (커널 소켓 버퍼)
- 네트워크 카드 Performance 모드 설정 (WiFi 전력 관리 해제)
워크스페이스 빌드 시 자동 적용 —
unicorn-racing-stack/unicorn.sh안에 버퍼 사이즈 세팅과 Performance 설정 중 프로토콜 레벨 절전 해제가 포함되어 있어, 세팅 스크립트를 실행하면 자동으로 적용됩니다. 드라이버 레벨 전력 관리 해제는 스크립트에 포함되어 있지 않으므로 필요 시 수동으로 적용합니다. 본 포스트에서는 이 세팅들이 통신 안정성에 도움이 되는 이유와 함께, 개별적으로 적용하는 방식을 다룹니다.
1. 메모리 버퍼 늘리기
ROS2에서 CycloneDDS를 사용할 때 대용량 메시지(LiDAR 포인트클라우드, 이미지 등)를 주고받으면, OS의 소켓 버퍼가 부족해 패킷이 드롭되거나 지연이 발생합니다.
CycloneDDS는 소켓을 생성할 때 커널에 “이만큼의 버퍼를 달라”고 요청하는데, 커널의 상한(net.core.rmem_max)이 그 요청보다 작으면 해당 상한값으로 잘리게 됩니다.
- Ubuntu 기본
rmem_max≈ 208KB → CycloneDDS 요청(약 1MB)이 잘림 → warning / 드롭 발생 rmem_max를 충분히 크게(2GB) 열어두면 → CycloneDDS가 필요한 만큼 가져감 (여유분은 실제로 점유되지 않음)
즉, 커널 상한만 충분히 열어두면 CycloneDDS 쪽(xml)은 따로 건드릴 필요가 없으며, 실제로 2GB를 통째로 점유하는 것이 아니라 “천장”만 최대로 열어두는 개념에 가깝습니다.
이 설정은
unicorn.sh에 이미 포함되어 있어 스크립트 실행 시 자동으로 적용되며, 아래에서는 스크립트가 수행하는 작업의 내용과 함께 수동으로 적용할 때의 절차를 다룹니다.
현재 값 확인
1
sysctl net.core.rmem_max net.core.wmem_max
영구 적용
1
2
3
4
5
6
sudo tee /etc/sysctl.d/60-cyclonedds.conf << 'EOF'
net.core.rmem_max=2147483647
net.core.wmem_max=2147483647
EOF
sudo sysctl --system
2147483647(2³¹ - 1 ≈ 2GB)은 CycloneDDS 공식 문서에서 권장하는 최대값입니다.
적용 확인
1
2
sysctl net.core.rmem_max
# net.core.rmem_max = 2147483647 이면 정상
CycloneDDS 실행 시 소켓 버퍼 관련 warning이 사라지고 드롭이 없으면 정상적으로 적용된 것이며, Host와 Client 양쪽 모두에 적용합니다.
2. 네트워크 카드 Performance 모드 설정 (WiFi Power Management 끄기)
Ubuntu 설치 시 NetworkManager는 기본적으로 WiFi를 Powersave 모드로 설정하는데, 이 설정은 네트워크 출력에 제한을 걸어 실시간 통신이 필수인 원격 통신 환경에서는 큰 지연 요인으로 작용할 수 있습니다.
Ubuntu 기본 세팅 + 드라이버 기본 세팅 (ping이 간헐적으로 10배 이상 튀는 현상 발생, max = 39ms)
전력 관리는 두 레벨에서 이뤄지며, 각각 적용 범위가 다릅니다.
| 레벨 | 대상 | 적용 범위 |
|---|---|---|
| 프로토콜 / NetworkManager | iw, NetworkManager | 거의 모든 칩셋 |
드라이버 (iwlwifi) | Intel WiFi 칩셋 | Intel 전용 |
Performance 설정 중 프로토콜 레벨(2-2절)은
unicorn.sh에 포함되어 있어 스크립트 실행 시 자동으로 적용됩니다. 드라이버 레벨(2-3절)은 스크립트에 포함되어 있지 않으므로, 필요한 경우 아래 과정을 따라 수동으로 적용합니다.
Host와 Client 모두 적용해야 합니다.
2-1. WiFi 인터페이스 이름 확인
먼저 자기 장비의 무선 인터페이스 이름을 확인합니다. 이후 등장하는 모든 명령어의 인터페이스 이름은 여기서 확인한 값으로 바꿉니다.
1
2
3
ifconfig
# 또는
ip link
wlp2s0, wlan0, wlo1 등 장비마다 다르게 나옵니다.
아래 예시에 나오는 인터페이스이름은 그대로 사용하지 않고, 위에서 확인한 실제 이름(예: wlp2s0)으로 바꿉니다.
2-2. 프로토콜 레벨 절전 해제 (모든 칩셋 공통)
이 단계는 unicorn.sh에 포함되어 있어 스크립트 실행 시 자동으로 적용됩니다. 아래는 수동으로 적용할 때의 절차입니다.
즉시 적용 (재부팅 시 초기화):
1
sudo iw dev 인터페이스이름 set power_save off
영구 적용:
1
2
3
4
5
6
sudo tee /etc/NetworkManager/conf.d/wifi-powersave-off.conf << 'EOF'
[connection]
wifi.powersave = 2
EOF
sudo systemctl restart NetworkManager
wifi.powersave 값은 2가 비활성화(항상 켜짐), 3이 절전 활성화에 해당합니다.
확인:
1
2
iw dev 인터페이스이름 get power_save
# 'power save: off' 이면 정상
WiFi power save off + 드라이버 기본 세팅 (ping이 간헐적으로 튀긴 하나 기존보다 폭이 감소, max = 8.8ms)
2-3. 드라이버 레벨 전력 관리 해제 (Intel 칩셋 전용)
이 절은 Intel WiFi 칩셋에 해당하는 내용입니다.
iwlwifi는 Intel 전용 드라이버이며, Realtek / MediaTek / Qualcomm 등 다른 칩셋에는 해당하지 않습니다. Intel 칩셋이 아닌 경우 2-2절까지만 적용해도 되며, 그것만으로도 상당 부분 개선됩니다. 진행에 앞서 아래에서 자기 칩셋을 먼저 확인합니다.
이 단계는 unicorn.sh에 포함되어 있지 않으므로 수동으로 적용합니다.
여러 설정을 시도한 결과, 가장 효과가 확실했던 것은 이 드라이버 레벨 전력 관리 설정이었습니다.
원인
Linux의 iwlwifi 드라이버는 NetworkManager의 WiFi Power Management와는 별개로, 드라이버 레벨에서 자체적인 전력 관리를 수행합니다. 기본값인 power_scheme=2(균형 모드)에서는 트래픽이 없을 때 칩을 저전력 상태로 전환하며, 다시 깨어나는 과정에서 수십~수백 ms의 지연이 발생하는데 이것이 ping 스파이크의 직접적인 원인이 됩니다.
즉, iw ... set power_save off(프로토콜 레벨)만으로는 충분하지 않으며, 드라이버 레벨의 전력 관리도 함께 해제해주어야 합니다.
WiFi 칩셋 확인
1
lspci | grep -i net
1
02:00.0 Network controller: Intel Corporation Device 2725 (rev 1a)
Intel Corporation이 보이면 Intel 칩셋(위 예시는 AX211, Device 2725)이며 iwlwifi를 사용합니다. Intel 칩셋이 아닌 경우 이 절은 건너뛰고 2-2절까지만 적용합니다.
커널 버전 및 드라이버 모듈 확인
커널 버전에 따라 로드되는 모듈이 다르며, 그에 따라 설정할 파라미터 경로가 달라집니다.
1
2
3
4
5
# 커널 버전 확인
uname -r
# 로드된 모듈 확인
lsmod | grep iwl
| 커널 버전 | 모듈 |
|---|---|
| 커널 5.x | iwlmvm |
| 커널 6.17+ | iwlmld |
커널 버전에 해당하는 쪽을 따릅니다.
커널 5.x (iwlmvm)
현재 전력 설정 확인:
1
2
cat /sys/module/iwlwifi/parameters/power_save
cat /sys/module/iwlmvm/parameters/power_scheme
적용:
1
echo -e "\noptions iwlwifi power_save=0\noptions iwlmvm power_scheme=1" | sudo tee -a /etc/modprobe.d/iwlwifi.conf
모듈 재로드 (재부팅 없이 적용, WiFi 연결이 일시적으로 끊깁니다):
1
2
3
sudo rmmod iwlmvm
sudo rmmod iwlwifi
sudo modprobe iwlwifi
적용 확인:
1
2
cat /sys/module/iwlwifi/parameters/power_save
cat /sys/module/iwlmvm/parameters/power_scheme
커널 6.17+ (iwlmld)
현재 전력 설정 확인:
1
2
cat /sys/module/iwlwifi/parameters/power_save
cat /sys/module/iwlmld/parameters/power_scheme
적용:
1
echo -e "\noptions iwlwifi power_save=0\noptions iwlmld power_scheme=1" | sudo tee -a /etc/modprobe.d/iwlwifi.conf
모듈 재로드 (재부팅 없이 적용, WiFi 연결이 일시적으로 끊깁니다):
1
2
3
sudo rmmod iwlmld
sudo rmmod iwlwifi
sudo modprobe iwlwifi
적용 확인:
1
2
cat /sys/module/iwlwifi/parameters/power_save
cat /sys/module/iwlmld/parameters/power_scheme
확인
power_save: N, power_scheme: 1이 출력되면 정상 적용된 것입니다. power_scheme=1은 최고 성능 모드로, 칩의 저전력 전환을 비활성화합니다. /etc/modprobe.d/에 작성했으므로 재부팅 후에도 영구 적용됩니다.
적용 효과
드라이버 레벨의 전력 관리까지 해제하면 저전력 상태 전환에 따른 지연이 발생하지 않으므로, 간헐적으로 발생하는 ping 스파이크가 감소합니다. Host와 Client 양쪽 모두 Intel WiFi 칩셋을 사용한다면, 양쪽 모두에 적용합니다.
WiFi power save off + 드라이버 성능 세팅 (ping이 일정하고 낮음, max = 3ms)
요약
| 설정 | 대상 | 적용 방식 |
|---|---|---|
커널 버퍼 (rmem_max / wmem_max = 2GB) | 모든 장비 | unicorn.sh에 포함 |
프로토콜 절전 해제 (iw ... power_save off, wifi.powersave=2) | 모든 칩셋 | unicorn.sh에 포함 |
드라이버 절전 해제 (iwlwifi power_save=0, power_scheme=1) | Intel 칩셋 | 수동 적용 |
버퍼 및 절전 관련 설정은 Host와 Client 양쪽 모두에 적용합니다.
마무리
이 글에서는 ROS2 원격 통신 환경에서 지연과 ping 스파이크를 줄이는 두 가지 세팅 — 커널 소켓 버퍼 확대와 WiFi 전력 관리 해제(프로토콜·드라이버 레벨) — 를 다뤘습니다. 기본 세팅 대비 ping 최대값이 39ms → 3ms까지 줄어드는 것을 확인했습니다. 대부분은 unicorn.sh 실행으로 자동 적용되며, Intel 칩셋이라면 드라이버 레벨 해제까지 수동으로 적용하는 것을 권장합니다. 고정 IP 설정은 공유기에서 MAC 주소 기반 IP 고정하기를 참고하세요.
