유니콘 Pro Mac — 장시간 사용 시 전체 네트워크 블랙홀
답변함# 버그 리포트: 유니콘 Pro Mac — 장시간 사용 시 전체 네트워크 블랙홀 (인터넷 끊김)
## 요약
유니콘 Pro Mac 가동 중 **장시간 사용하면 Wi-Fi/핫스팟은 "연결됨"으로 표시되지만 실제 인터넷이 전혀 안 되는** 현상 발생. 재부팅하면 즉시 복구. 네트워크 종류(가정용 Wi-Fi / iPhone 핫스팟)와 무관하게 발생.
NE(Network Extension) provider 데몬 `unicornprod`가 리소스 한도(CPU/wakeup)를 초과해 스턱/폭주 상태가 되면서, 패킷터널(로컬 VPN) 경로로 들어온 전체 트래픽이 블랙홀되는 것으로 추정.
## 환경
- 기기: MacBook Pro (MacBookPro18,3)
- OS: macOS 27.0 beta, build 26A5353q (DB1) — **macOS 26에서도 동일 증상 발생**
- 유니콘 Pro Mac: **1.13.11 (build 307)**
- 동작 모드: 패킷터널(로컬 VPN, 전체 트래픽 가로채기) — `utun4` 인터페이스, 피어 `10.1.0.4`
## 증상
1. 일정 시간(수 시간) 연속 사용 후 발생.
2. 메뉴바/시스템설정에는 Wi-Fi "연결됨" 표시. 실제로는 DNS·HTTP 등 모든 외부 통신 불가.
3. **재부팅하면 사라짐.**
4. Wi-Fi, iPhone 핫스팟 가리지 않고 발생 → 링크 계층 문제 아님, 그 위(터널/필터) 계층 문제.
## 근거 (수집 데이터)
### 1. 전체 트래픽이 유니콘 로컬 터널로 라우팅됨
라우팅 테이블(`logs/02_routing_table.txt`)에 IPv4 전체 공간을 덮는 풀터널 라우트가 `utun4`로 설치됨:
```
0/2 utun4 USc
64/2 utun4 USc
128.0/2 utun4 USc
192.0.0/2 utun4 USc
10.1.0.4 10.1.0.4 UH utun4
```
`utun4`는 `inet 10.1.0.4 --> 10.1.0.4` (`logs/03_ifconfig_all.txt`). 즉 모든 패킷이 유니콘 패킷터널 provider를 통과. provider가 멈추면 전 트래픽 블랙홀.
### 2. `unicornprod` 리소스 한도 초과 리포트 (핵심)
`/Library/Logs/DiagnosticReports/`에 `unicornprod` cpu_resource 위반 리포트 존재 (`logs/unicornprod_*.cpu_resource.diag`):
- `unicornprod_2026-06-16-143553...cpu_resource.diag` — **사용자 재부팅 약 5분 전**
- `unicornprod_2026-06-10-165611...cpu_resource.diag` — 이전 재발 사례
→ 고장 직전 시점에 NE provider가 CPU/wakeup 한도를 초과하고 있었음. 재발성.
#### 2-1. 폭주 지점 (6/16 리포트 스택 — 핵심)
`unicornprod_2026-06-16-143553...cpu_resource.diag` 의 microstackshots 샘플 **10/10(100%)** 이 동일 콜스택에 고정:
```
unicorn::thread::Looper<shared_ptr<unicorn::packet::Ip>>::Run()
unicorn::vpn_server::tcp::Processor::RunEach(shared_ptr<unicorn::packet::Ip>)
unicorn::vpn_server::tcp::Processor::OnTcpPacketReceived()
unicorn::vpn_server::tcp::Processor::OnTcbNotFound(unicorn::vpn_server::Route) ← 여기서 스핀
```
리포트 수치:
```
CPU: 90 seconds cpu time over 105 seconds (86% cpu average),
exceeding limit of 50% cpu over 180 seconds
Time Since Boot: 418712s (~4.8일)
Time Awake Since Boot: 246659s (~68시간 — 장시간 가동)
Time Since Wake: 11s (웨이크 직후 발생)
```
**해석:** 패킷 처리 루퍼 스레드에서, TCB(TCP 제어블록)가 없는 TCP 패킷을 받았을 때 `OnTcbNotFound()` 경로가 busy-spin/무한루프에 빠짐. 단일 패킷 처리 스레드가 86%+ CPU로 포화 → 이후 모든 패킷이 처리되지 못하고 블랙홀 → "연결됨이나 인터넷 안 됨". `Time Since Wake 11s`로 보아 **슬립/웨이크(또는 네트워크 전환, 예: 핫스팟 재연결) 직후 TCB 상태가 유실된 패킷이 유입되면서 트리거**되는 것으로 추정. 장시간 가동·다수의 웨이크 누적이 발생 확률을 높임.
### 3. Apple 네트워크 스택은 정상
같은 기간 `configd` / `mDNSResponder` / `neagent` / `networkd` / `symptomsd` / Wi-Fi 드라이버의 크래시·리소스 위반 리포트 **0건**. 리소스 위반 리포트를 남긴 프로세스는 `unicornprod` 뿐.
### 4. 절전 설정 무관
`pmset`: `womp 0`, `tcpkeepalive 1`, `powernap 1` — 절전/Wake-on-LAN 관련 원인 아님.
## 추정 메커니즘
장시간 가동 → `unicornprod`(NE provider)가 리소스 누수/폭주로 한도 초과·스턱 → 커널의 풀터널 라우트는 그대로 유지되는데 provider가 패킷 처리 불가 → **전체 트래픽 블랙홀**. 링크는 살아있어 "연결됨" 표시. macOS가 NE를 재시작(재부팅)하면 복구. 터널은 링크 상위 계층이므로 Wi-Fi/핫스팟 종류와 무관.
macOS 27 DB1의 NetworkExtension API 변경이 악화 요인일 가능성 있음.
## 재현 / 임시 우회 (재부팅 불필요)
증상 발생 시, 재부팅 대신:
```bash
sudo killall unicornprod neagent
```
→ NE provider 재시작으로 인터넷 즉시 복구되면 본 원인 확정.
## 요청 사항
1. `unicorn::vpn_server::tcp::Processor::OnTcbNotFound()` 경로의 busy-spin/무한루프 점검 — TCB 미존재 TCP 패킷 입력 시 무한 재시도 없이 RST/drop으로 종료되는지 확인.
2. 슬립/웨이크·네트워크 전환 후 TCB 테이블 일관성 및 스테일 패킷 처리 검토.
3. provider 스턱 시 라우트 정리 또는 fail-open(터널 우회) 처리하는 watchdog 추가.
4. macOS 26 / 27 beta 호환성 확인.
## 첨부 (이 파일에 인라인)
단일 텍스트 통합본. 핵심 로그만 정제하여 아래 첨부. 앱목록 prefs(08)·MAC·사용자명 제외/마스킹.
원본 전체 묶음(diag 원본 포함)은 요청 시 제공 가능.
================================================================
첨부 로그 (정제됨: 사용자명/호스트명/MAC 마스킹)
================================================================
----- [A] 라우팅 테이블 IPv4 (풀터널 라우트 근거) -----
Routing tables
Internet:
Destination Gateway Flags Netif Expire
0/2 utun4 UScg utun4
default 172.20.10.1 UGScg en0
default 172.20.10.1 UGScIg en0
10.1.0.4 10.1.0.4 UH utun4
64/2 utun4 USc utun4
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
128.0/2 utun4 USc utun4
169.254 link#15 UCS en0 !
172.20.10/28 link#15 UCS en0 !
172.20.10.1/32 link#15 UCS en0 !
172.20.10.1 XX:XX:XX:XX:XX:XX UHLWIir en0 1121
172.20.10.2/32 link#15 UCS en0 !
172.20.10.2 XX:XX:XX:XX:XX:XX UHLWI lo0
172.20.10.15 XX:XX:XX:XX:XX:XX UHLWbI en0 !
192.0.0/2 utun4 USc utun4
224.0.0/4 link#15 UmCS en0 !
224.0.0.251 XX:XX:XX:XX:XX:XX UHmLWI en0
255.255.255.255/32 link#15 UCS en0 !
----- [B] utun4 / en0 인터페이스 -----
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether XX:XX:XX:XX:XX:XX
inet6 fe80::XXXX:XXXX:XXXX:XXXX%en0 prefixlen 64 secured scopeid 0xf
inet 172.20.10.2 netmask 0xfffffff0 broadcast 172.20.10.15
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
utun4: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 10.1.0.4 --> 10.1.0.4 netmask 0xffff0000
----- [C] DNS 리졸버 상태 -----
DNS configuration
resolver #1
nameserver[0] : 172.20.10.1
if_index : 15 (en0)
flags : Request A records
reach : 0x00020002 (Reachable,Directly Reachable Address)
resolver #2
domain : local
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300000
resolver #3
domain : 254.169.in-addr.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300200
resolver #4
domain : 8.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300400
resolver #5
domain : 9.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300600
resolver #6
domain : a.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300800
resolver #7
domain : b.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 301000
DNS configuration (for scoped queries)
resolver #1
nameserver[0] : 172.20.10.1
if_index : 15 (en0)
flags : Scoped, Request A records
reach : 0x00020002 (Reachable,Directly Reachable Address)
----- [D] cpu_resource.diag 핵심 (헤더 + 폭주 스택) -----
Date/Time: 2026-06-16 14:34:07.263 +0900
End time: 2026-06-16 14:35:52.099 +0900
OS Version: macOS 27.0 (Build 26A5353q)
Architecture: arm64e
Report Version: 73
Incident Identifier: (제거됨)
Data Source: Microstackshots
Shared Cache: (생략)
Command: unicornprod
Path: /Applications/UnicornProMac.app/Contents/Library/LaunchServices/unicornprod
Codesigning ID: unicornprod
Team ID: ZK3X78K4RG
Resource Coalition: "com.unicornsoft.unicornproformac.unicornprod"(537)
Architecture: arm64
Parent: UNKNOWN [1]
PID: 5603
Event: cpu usage
Action taken: none
CPU: 90 seconds cpu time over 105 seconds (86% cpu average), exceeding limit of 50% cpu over 180 seconds
CPU limit: 90s
Limit duration: 180s
CPU used: 90s
CPU duration: 105s
Duration: 104.84s
Duration Sampled: 33.07s (event starts 71.55s before samples, event ends 0.22s after samples)
Steps: 10 (12 gigacycles/step, 9 samples lost)
Hardware model: MacBookPro18,3
Active cpus: 10
Memory size: 16 GB
HW page size: 16384
VM page size: 16384
Shared cache residency: 11.73% (767.88 MB / 6545.92 MB)
Time Since Boot: 418712s
Time Awake Since Boot: 246659s
Time Since Wake: 11s
[폭주 콜스택 - microstackshots 10/10 동일, 바깥→안]
unicorn::thread::Looper<shared_ptr<packet::Ip>>::Run()
-> vpn_server::tcp::Processor::RunEach(shared_ptr<packet::Ip>)
-> vpn_server::tcp::Processor::OnTcpPacketReceived()
-> vpn_server::tcp::Processor::OnTcbNotFound(Route) [스핀]
0
댓글 1개
날짜
투표수
-
안녕하세요, 유니콘 고객센터입니다.
자세한 버그 리포트와 로그 전달 감사합니다.
추가 원인 확인을 위해 몇 가지 사항을 확인 부탁드립니다.
혹시 Flexcil 또는 VSCode의 Codex 플러그인을 사용 중이신지요?
일부 환경에서 해당 프로그램 사용 여부가 현상과 관련이 있을 가능성을 확인하고 있습니다.
회신해 주시면 추가 확인 후 안내드리겠습니다.
감사합니다.
0
대화에 참여하세요
댓글을 달려면 가입하거나 로그인하세요.