AI 기반 서비스

Today
-
Total
-
← 목록으로

DGX Spark는 WOL을 지원하지 않는다 - Tapo 스마트 플러그로 해결한 이야기

이창연•2026년 1월 30일

DGX Spark는 WOL을 지원하지 않는다

밤새 228번의 헛수고

2026년 1월 30일 아침. 텔레그램에 알림이 와 있었다.

⚡️ Spark 전원 꺼짐 감지
• WOL 패킷 전송 중...
• MAC: 4c:bb:47:29:b1:81

miniPC의 watchdog이 Spark 장애를 감지하고 WOL을 보낸 것이다. 저번에 구축한 자동 복구 시스템이 제대로 작동했구나!

...라고 생각했는데, CraftBay MCP는 여전히 응답이 없었다.

state.json을 확인해보니:

{
  "craftbay": {
    "failures": 228,
    "wol_sent": true,
    "last_wol": "2026-01-30T03:17:31+09:00"
  }
}

228번 실패. WOL은 새벽 3시 17분에 보냈는데, 아침 7시가 넘도록 Spark는 깨어나지 않았다.

로그가 말해주는 불편한 진실

watchdog.log는 매 분마다 같은 메시지를 기록하고 있었다:

[2026-01-30 06:48:31] WARN: CraftBay MCP 헬스체크 실패 (연속 212 회)
[2026-01-30 06:48:34] WARN: Spark 서버 ping 실패 - 전원 꺼짐 추정
[2026-01-30 06:48:34] INFO: WOL 이미 전송됨, 부팅 대기 중...

WOL 보내놓고 계속 기다리는 중. 근데 Spark는 안 일어난다.

cron.log를 보니 더 심각했다:

OSError: [Errno 101] Network is unreachable
OSError: [Errno 101] Network is unreachable
OSError: [Errno 101] Network is unreachable
...
WOL packet sent to 4c:bb:47:29:b1:81
WOL packet sent to 4c:bb:47:29:b1:81

대부분의 WOL 시도가 네트워크 도달 불가 에러로 실패했고, 마지막 2번만 성공했다. 그런데도 Spark는 안 깨어났다.

NVIDIA 포럼의 충격적인 답변

혹시나 해서 "DGX Spark Wake-on-LAN"으로 검색해봤다.

NVIDIA 개발자 포럼에 똑같은 질문이 있었다:

질문: nmcli, ethtool 설정 다 해봤는데 WOL이 안 됩니다. BIOS에도 설정이 없는데 어떻게 해야 하나요?

그리고 NVIDIA 직원의 답변:

confirmed Spark does not support wake-on-lan

DGX Spark는 WOL을 지원하지 않는다.

열심히 구축한 WOL 복구 시스템이 애초에 불가능한 미션이었던 것이다.

포럼 유저의 우회 해결책

같은 스레드에서 질문자가 자신의 해결책을 공유했다:

I left the default bios power behavior at "auto boot" and used a phone controllable smart plug.

So I shutdown box normally, then power off smart plug. Later power on smart plug and it boots right up.

Next best thing to wake on lan.

스마트 플러그로 전원을 껐다 켜면 자동 부팅된다!

Tapo P110M 등장

다행히 집에 TP-Link Tapo 스마트 플러그가 있었다.

장비모델IP
서버 플러그Tapo P110M192.168.50.77

그리고 PyPI에 비공식 Tapo API 라이브러리가 있었다:

pip install tapo

사용법도 간단하다:

from tapo import ApiClient

client = ApiClient("[email protected]", "password")
device = await client.p110("192.168.50.77")

await device.on()   # 전원 켜기
await device.off()  # 전원 끄기

새로운 복구 스크립트

miniPC에 tapo-spark.py를 만들었다:

#!/usr/bin/env python3
"""Tapo P110M 전원 제어 - DGX Spark용"""
import asyncio
from tapo import ApiClient

TAPO_EMAIL = "[email protected]"
TAPO_PASSWORD = "your_password"
PLUG_IP = "192.168.50.77"

async def power_cycle(delay=5):
    """전원 끄고 → 대기 → 켜기 (Spark 재부팅용)"""
    client = ApiClient(TAPO_EMAIL, TAPO_PASSWORD)
    device = await client.p110(PLUG_IP)
    
    print("Tapo P110M: 전원 OFF")
    await device.off()
    
    print(f"Tapo P110M: {delay}초 대기...")
    await asyncio.sleep(delay)
    
    print("Tapo P110M: 전원 ON")
    await device.on()
    
    print("Tapo P110M: 전원 사이클 완료")

if __name__ == "__main__":
    asyncio.run(power_cycle())

Watchdog v3.0 - WOL에서 Tapo로

watchdog.sh를 전면 수정했다:

이전 (v2.0) - WOL 방식

# Spark ping 실패 시
if ! ping_check "$SPARK_IP"; then
    send_wol  # Magic Packet 전송
fi

현재 (v3.0) - Tapo 방식

# Spark ping 실패 시
if ! ping_check "$SPARK_IP"; then
    python3 tapo-spark.py cycle 5  # 전원 off → 5초 대기 → on
fi

실제 테스트

Spark가 꺼진 상태에서 테스트:

$ python3 tapo-spark.py status
장치명: 안방 플러그
전원상태: OFF

$ python3 tapo-spark.py on
Tapo P110M: 전원 ON

$ sleep 60 && ping -c 3 192.168.50.150
PING 192.168.50.150 (192.168.50.150) 56(84) bytes of data.
64 bytes from 192.168.50.150: icmp_seq=1 ttl=64 time=0.847 ms

성공! 🎉

스마트 플러그를 켜니 Spark가 자동으로 부팅됐다. BIOS의 "Power On after Power Loss" 설정 덕분이다.

복구 시스템 비교

항목WOL (v2.0)Tapo (v3.0)
DGX Spark 지원❌ 미지원✅ 가능
네트워크 의존성LAN 브로드캐스트로컬 IP 직접
추가 장비없음스마트 플러그
복구 방식Magic Packet전원 사이클
BIOS 설정불필요Auto Boot 필요

최종 방어 체계 (업데이트)

단계방어책효과
1차LLM 호출 딜레이 (10초)과부하 방지
2차배치 휴식 (10건/60초)GPU 쿨다운
3차WOL 자동 복구❌ 불가능
3차Tapo 전원 제어✅ 죽어도 부활

교훈

  1. 데이터센터 장비는 다르다 - DGX Spark 같은 전문 장비는 일반 PC와 다르다. WOL 대신 IPMI/BMC 같은 별도 관리 인터페이스를 쓴다.

  2. 문서화의 중요성 - NVIDIA 포럼에 같은 고민을 한 사람이 있어서 시간을 아꼈다. 나도 이렇게 기록을 남긴다.

  3. 스마트홈이 서버 운영에도 쓰인다 - 원래 가전제품 제어용인 Tapo가 서버 자동 복구에 쓰일 줄이야.

  4. Plan B는 항상 준비하자 - WOL이 안 되면 물리적 전원 제어로 우회. 방법은 있다.

이제 진짜로 새벽에 Spark이 죽어도 자동으로 살아날 것이다. 아마도.


추신: "안방 플러그"라고 표시되는 건 Tapo 앱에서 이름을 아직 안 바꿔서 그렇다. 나중에 "서버 플러그"로 바꿔야지.