24/7 macOS Mac mini에서 돌아가는 OpenClaw 게이트웨이는 가끔 죽지 않고 얼어붙습니다. Slack 타이핑 표시는 멈추고 대시보드 RPC 프로브는 초록인데 사용자에게는 90초 이상 답이 안 옵니다. 운영자는 모델 장애로 단정하기 쉬지만 실제로는 읽기 타임아웃이 끝나지 않는 바이트를 기다리거나 Wi-Fi 순간 끊김 뒤 반쯤 열린 TLS가 멈춘 경우가 섞입니다. 이 글은 읽기 정체와 HTTP 429를 분리하고 재현 가능한 curl -m 기준을 세우며 채널 역압을 게이트웨이 로그에 묶습니다. 응답은 오지만 물러서야 하는 상황은 공급자 429와 Retry-After를 함께 읽으세요. 인증·바인드·포트 축은 게이트웨이 doctor 진단이 먼저입니다. 리버스 프록시가 앞에 있으면 프록시·터널 경화로 유휴 타임아웃을 종단 간 맞추지 않으면 여기서 조여도 입구에서 다시 터집니다. 로컬 병렬과 재시도 폭풍은 토큰 예산과 스로틀링과 같이 봐야 읽기 조정만으로는 안 줄어드는 가짜 교착도 줄일 수 있습니다.
이 글을 끝내면 의사결정 표, 감사를 통과할 만한 숫자 출발점, macOS 로그 팁, 플랫폼 엔지니어용 FAQ를 가져갈 수 있습니다.
운영 조직이 흔히 놓치는 것은 “프로세스가 살아 있다”와 “사용자 경험이 진행 중이다”를 동치로 두는 착각입니다. 헬스 엔드포인트가 200을 돌려도 애플리케이션 계층 읽기가 막히면 채팅 UI는 그대로 멈춥니다. 따라서 헬스 체크는 소켓 수준과 애플리케이션 수준을 분리해 설계하고, 스트리밍 경로에는 첫 토큰까지의 시간과 청크 사이 유휴 시간을 별도로 기록해야 합니다.
재무·보안 리뷰를 통과하려면 사건 동안 바뀐 상수를 Git 커밋과 1:1로 묶어 두는 것이 중요합니다. 온콜이 “그때 뭐가 살아 있었지?”를 추측하지 않게 말입니다.
네트워크 팀과는 합성 프로브의 User-Agent를 미리 합의해 방화벽 예외를 좁게 열 수 있게 하세요. 프로브는 성공하는데 실사용만 실패할 때 MTU나 TCP 윈도 배율 차이를 의심하는 루틴을 문서에 박아 두면 브리지 시간이 줄어듭니다.
스토리지 팀과는 로그 파티션의 여유 공간을 게이트웨이 SLO에 포함시키세요. APFS 스냅샷이나 동일 볼륨 그룹의 백업이 IOPS를 빼앗으면 write() 대기가 모델 중단처럼 보입니다.
제품 커뮤니케이션은 기술적으로 정확한 한 문장이 사용자 신뢰를 지킵니다. “모델이 느립니다”보다 “업스트림 응답이 예상보다 늦습니다, 자동 재시도 중입니다”가 낫습니다. 내부 호스트명이 섞이지 않게 스택 트레이스를 채널에 그대로 붙여 넣지 마세요.
다국어 워크스페이스에서는 로케일 헤더에 맞춰 정체 안내 문구를 나누는 편이 지원 부담을 줄입니다. 같은 영어 문구를 모든 지역에 그대로 쓰면 오해가 누적됩니다.
분석 파이프라인에서는 “첫 토큰 없음”과 “중간에 스트림 멈춤”을 분리 태깅하세요. 전자는 연결·인증 쪽으로, 후자는 읽기 유휴 타이머나 업스트림 청크 정지로 거의 매핑됩니다. 라벨이 틀리면 OAuth를 파고들다가 사실은 타임아웃 표 차이였던 케이스가 반복됩니다.
고객 대면 상태 페이지가 있다면 합성 프로브의 시작 전송 시간이 기준의 두 배를 넘을 때 노란 배지를 켜 두면 트위터가 폭발하기 전에 커뮤니케이션이 앞설 수 있습니다.
보안 검토자는 읽기 창을 늘리면 공격자가 연결을 길게 붙잡는 체류 시간이 늘지 않냐고 묻습니다. 이때는 테넌트당 최대 동시 스트림을 낮춰 위험을 묶는 식으로 트레이드오프를 설명하세요.
읽기 타임아웃 비율이 7일 이동 평균의 네 배를 10분 넘게 유지하면 네트워크를 먼저 호출하고 모델 라우팅 변경은 뒤로 미루는 정책이 안전합니다.
구조화된 감사 로그는 90일 보관을 목표로 하고 사용자 메시지와 공급자 요청 ID를 상관 ID로 엮으세요.
분기마다 가장 긴 대기 상위 35건을 사람이 직접 읽으세요. 자동 버킷은 지역적 브라운아웃을 로컬 버그로 잘못 라벨합니다.
그라파나에는 타임아웃 상수를 건드린 Git 머지를 주석으로 남겨 스파이크가 의도적 변경인지 즉시 판별하세요.
공급자 상태 페이지가 “지연 상승”만 말할 때는 스트리밍 유휴를 잠시 짧게 해 사용자에게 명시적 재시도 문구를 보여 주고 4시간 안에 티켓에 묶인 롤백 체크리스트로 되돌리는 운용이 현실적입니다.
장애 중 기능 개발을 멈추고 tcpdump 요약과 TLS 세션 ID를 동결한 뒤 마지막 타임아웃 변경을 즉시 롤백할 수 있게 하세요.
“브레이크 글래스”로 임시 상한을 올릴 때도 티켓 ID 없이는 허용하지 않는 정책이 필요합니다. 그렇지 않으면 출시 주말에만 조용히 천장이 올라가고 일요일 청구만 튀는 운영 부채가 남습니다.
스테이징과 프로덕션의 connect·첫 바이트·유휴·벽시계 상한을 표 한 줄씩 적어 브리지에서 5분 안에 차이를 설명할 수 있게 하세요.
스트리밍 JSON에서 토큰이 300ms만 보이고 침묵하면 업스트림이 청크 중간에서 멈춘 전형입니다. 이때는 모델 자체가 아니라 읽기 유휴 타이머를 먼저 의심합니다.
시간당 읽기 타임아웃 건수·평균 정체 시간·포기된 대화·“AI 멈춤”으로 재오픈된 티켓 네 계열이 없으면 타임아웃 변경이 도움이 됐다고 증명하기 어렵습니다.
curl 재현은 게이트웨이 호스트와 베스천에서 동시에 돌려 time_starttransfer가 갈라지는지 보세요. 갈라지면 OpenClaw 본체보다 경로 쪽이 의심됩니다.
기업 프록시가 청크 인코딩을 제거하면 curl은 EOF까지 버퍼링합니다. 게이트웨이 HTTP 라이브러리의 HTTP/1.1 대 HTTP/2 설정을 맞춰 재현 조건을 바이트 단위로 맞추세요.
TLS 세션 재개는 간헐적 읽기 정지를 가릴 수 있으니 진단 클라이언트를 가끔 로테이션해 새 핸드셰이크를 강제하세요.
하드웨어 조달이 늦으면 클라우드 Mac mini로 연습하세요. MacHTML Apple 실리콘은 대략 일 $16.9 전후에 SSH/VNC가 함께 제공되어 라이브 캡처에 적합합니다.
잘못된 실패 모드를 보고 있다는 신호
대시보드가 건강해도 사용자가 기다리면 대개 애플리케이션 계층 읽기에 걸려 있습니다. 스트리밍 JSON에서 토큰이 잠깐만 나오고 멈추면 업스트림이 청크 중간에서 멈춘 전형입니다.
재무 친화 카운터는 네 가지입니다. 시간당 읽기 타임아웃, 평균 정체 시간, 포기된 대화, “AI 멈춤” 재오픈 티켓입니다.
사건 중에는 기능 개발을 멈추고 tcpdump 요약과 TLS 세션 ID를 동결한 뒤 마지막 타임아웃 변경을 롤백할 준비를 하세요.
임시 상한 인상은 티켓 ID 없이 허용하지 마세요.
환경별 상한을 한 줄 표로 유지해 감사가 빠르게 비교하게 하세요.
표: 읽기 타임아웃·429·DNS
| 증상 | 가능 클래스 | 첫 프로브 |
|---|---|---|
| Retry-After가 있는 HTTP 429 | 속도 제한 | 공급자 백오프 가이드 |
| 연결 시간보다 길게 상태 줄 없음 | 읽기 정체 | 단계적 curl -m |
| 즉시 NXDOMAIN | DNS | 게이트웨이 호스트에서 dig +trace |
감사를 통과할 초기 타임아웃
연결 5초, 대화형 모델 첫 바이트 읽기 45초, 스트리밍 청크 유휴 12초, 사용자 턴당 벽시계 180초에서 구조화된 핸드오프 링크를 돌려보내는 식이 현실적인 출발점입니다.
읽기 타임아웃 후 재시도는 공급자가 명시적 사건을 올리지 않는 한 사용자 메시지당 두 번으로 캡하세요.
유지보수 창은 시작 15분 전부터 동시성을 20% 낮춰 겹친 재시도가 정체를 증폭하지 않게 하세요.
타임아웃 표는 Git으로 버전 관리하세요.
curl 재현 레시피
# 천장을 단계적으로 올려 업스트림 정체 지점을 찾는다
curl -sS -o /dev/null -w '%{http_code} %{time_connect} %{time_starttransfer}\n' \
-H "Authorization: Bearer $TOKEN" \
-m 10 https://api.example.com/v1/models
curl ... -m 30 ...
curl ... -m 60 ...
같은 열을 게이트웨이와 베스천에서 실행해 time_starttransfer가 갈라지는지 보세요.
-w '%{remote_ip}'로 DNS가 기대 anycast POP에 붙는지 확인합니다.
스트리밍은 --no-buffer와 pv로 서버 정지와 로컬 터미널 역압을 분리하세요.
macOS·launchd·디스크 압력
상세 로그는 루트 볼륨 여유가 12% 아래로 떨어지면 write()에서 막혀 모델 교착처럼 보일 수 있습니다.
diskutil apfs listVolumeGroups로 스냅샷을 확인하세요.
TLS 세션 재개는 간헐적 읽기 정지를 가릴 수 있습니다.
클라우드 Mac mini로 연습하면 macOS 스택을 생산에 가깝게 재현합니다.
정체 중 채널 UX
Slack·Teams 사용자는 이유가 설명되면 기다릴 수 있습니다. 8초·45초·120초의 삼단 메시지가 현실적입니다.
내부 호스트명이 섞인 스택 트레이스를 채널에 붙이지 마세요.
텔레메트리와 SLO
합성 프로브의 time_starttransfer 히스토그램과 라이브 게이트웨이 지표를 비교해 25% 이상 벗어나면 로컬 정책 드리프트를 의심합니다.
전용 User-Agent로 프로브를 태그하세요.
FAQ
읽기 타임아웃은 429와 같나요?
아닙니다. 429에는 상태 줄이 있습니다.
먼저 타임아웃을 늘리나요?
티켓·상한·롤백 시각이 있을 때만입니다.
물리 Mac mini를 쓰는 이유는?
macOS TLS·launchd·디스크는 Linux CI와 다릅니다.
Apple Silicon Mac mini는 OpenClaw 타임아웃 연습에 가장 충실한 무대입니다. 긴 캡처에도 읽기 쉬운 서멀, 네이티브 키체인, 생산 게이트웨이와 비슷한 네트워크 스택이 갖춰져 있습니다. MacHTML은 SSH/VNC가 있는 클라우드 Mac mini로 읽기 정책·doctor 프로브·스로틀 상호작용을 추가 CapEx 없이 검증할 수 있게 합니다. 훈련에 맞춰 잠깐 빌려 증거를 모으고 녹색이면 반납하세요.
클라우드 Mac mini에서 OpenClaw 타임아웃 리허설
Apple Silicon을 임대해 읽기 정체 재현, 상한 조정, doctor와 스로틀 검증을 실제 macOS에서 수행하세요.