Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Visiting goroutine stacks by pprof can block all goroutines #35664

Closed
lixiaojun629 opened this issue Nov 18, 2019 · 2 comments
Closed

Visiting goroutine stacks by pprof can block all goroutines #35664

lixiaojun629 opened this issue Nov 18, 2019 · 2 comments

Comments

@lixiaojun629
Copy link

What version of Go are you using (go version)?

$ go version
go version go1.13.4 darwin/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/rilke/Library/Caches/go-build"
GOENV="/Users/rilke/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/rilke/go"
GOPRIVATE=""
GOPROXY="https://goproxy.io,direct"
GOROOT="/usr/local/Cellar/go/1.13.4/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.13.4/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/jg/d03tz52x12g_xf_x7cmdtn840000gn/T/go-build179904585=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

I run the code below, and open the url http://localhost:6060/debug/pprof/goroutine?debug=1 in my browser. But the page never show and the string "xx" stop printing, which means goroutine2 stop running.

package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
)

func main() {
        //goroutine1
	go func() {
		for {
		}
	}()
       //goroutine2
	go func() {
		for {
			fmt.Println("xx")
		}
	}()

	http.ListenAndServe("0.0.0.0:6060", nil)
}

What did you expect to see?

I expect the page http://localhost:6060/debug/pprof/goroutine?debug=1 to be loaded normally, and goroutine2 should not stop printing

What did you see instead?

The page http://localhost:6060/debug/pprof/goroutine?debug=1 never load and goroutine2 stop printing when I visit the url http://localhost:6060/debug/pprof/goroutine?debug=1 in my browser.

@hyangah
Copy link
Contributor

hyangah commented Nov 18, 2019

Seems like #10958 - for goroutine profile, runtime tries to stop the world.

@ianlancetaylor
Copy link
Contributor

Don't write busy loops in Go.

That said, this should work better in the upcoming Go 1.14 release. Closing as dup of #10958.

@golang golang locked and limited conversation to collaborators Nov 17, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants