고루틴 누수 프로파일

Goroutine leak profile

영원히 깨울 수 없는 고루틴을 별도 프로파일에서 찾습니다.

···
html
<div class="v"><header><b>GOROUTINE LEAK PROFILE</b><span id="state"></span></header><main><div class="leak"><div class="workers"><div id="worker1">G1: send</div><div id="worker2">G2: send</div><div id="receiver">receiver</div></div><div class="profile"><b>PROFILE</b><span id="profile"></span></div></div></main><footer>unreachable channel leaves senders blocked</footer></div>
css
.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,3.2vmin,17px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.28} .leak{height:100%;display:flex;align-items:center;gap:8px}.workers{width:59%;display:flex;flex-direction:column;gap:5px}.workers div,.profile{border:1px solid var(--line);border-radius:6px;padding:7px;font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}.workers div.stuck{border-color:var(--accent-2);color:var(--accent-2)}.profile{width:41%;min-height:55%;box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;gap:8px;text-align:center}.profile b{color:var(--accent)}.profile span{font-size:1em}
js
let n=0;function draw(){const stuck=n>=1;for(const id of ["worker1","worker2"])document.getElementById(id).classList.toggle("stuck",stuck);document.getElementById("receiver").textContent=stuck?"receiver: gone":"receiver: active";document.getElementById("profile").textContent=n===2?"G1 · G2 leaked":stuck?"GC checks reachability":"0 leaked";document.getElementById("state").textContent=["running","blocked","detected"][n];n=(n+1)%3}draw();setInterval(draw,1000)

Go 1.27의 goroutineleak 프로파일은 채널이나 동기화 원시 요소에서 영구적으로 막힌 고루틴을 찾아냅니다. 예를 들어 수신자가 조기 종료한 비버퍼 채널의 송신자는 다시 진행할 수 없습니다.

가비지 컬렉터의 도달 가능성 분석을 활용하므로 모든 종류의 누수를 찾지는 못합니다. 전역 변수처럼 원시 요소가 계속 도달 가능한 경우나 네트워크 I/O 대기는 이 방식으로 판별되지 않을 수 있습니다.

언제 쓰나

고루틴 수가 늘 때 정상 대기와 복구 불가능한 대기를 구별합니다.

페이지로 열기 ↗