2017-09-22 1 views
2

내 응용 프로그램을 프로파일 링하기 위해 채널에 쓰거나 읽는 것을 기다리는 goroutine의 수를 알고 싶습니다. reflect package과 관련된 내용을 찾을 수 없습니다.프로파일 링을 위해 채널 쓰기/읽기를 기다리는 goroutines 수 얻기 (프로파일 링을 위해)

물론 명시적인 카운터를 유지할 수는 있지만 golang 런타임에이를 알리 길 기대합니다. 따라서 휠 재발생을 피하려고합니다.

그래서 수동으로 카운터를 유지하지 않고도 그렇게 할 수 있습니까?

답변

1

이는 runtime.NumGoroutine() - GOMAXPROCS

를 들어를 초과 그것은 매우 근접하고 안 루틴 만 차단 이동 정확히 수 없습니다 비록 당신은 아마 runtime.NumGoroutine()

https://golang.org/pkg/runtime/#NumGoroutine

찾고있는 전체 부하를 추적하려면 채널 당 이동 루틴을 다음과 같이 수행 할 수 있습니다.

  1. https://golang.org/pkg/runtime/pprof/#Do을 사용하여 루틴을 특정 채널로 표시하십시오.
  2. http/pprof을 사용하면 현재 프로필 및 파싱 결과에 대한 정보를 얻을 수 있습니다. 자세한 내용은이 답변을 참조하십시오. https://stackoverflow.com/a/38414527/1975086. 또는 http/pprof을 살펴보고 입력 정보로 앱 내에서 정보를 얻을 수있는 방법을 알아보십시오.
+0

고마워,하지만 문제가 해결되지 않는다 : 분명히 내 응용 프로그램에 둘 이상의 채널이 있고 goroutines이 다른 채널에서 기다리고 있으므로 어떤 채널을 기다리고 있는지 확인할 필요가있다. 병목 현상을 발견 할 수 있습니다. –

+0

맞아, 내 대답을 업데이트 할게. –

+0

"블록"프로파일을 얻기 위해'net/http/pprof'를 사용할 필요가 없습니다. http handler를 원하지 않는다면'runtime/pprof'에서 직접 같은 것을 할 수 있습니다. – JimB

관련 문제