Linux Goroutine处于IO等待状态很长时间

Linux Goroutine处于IO等待状态很长时间,linux,go,httpserver,Linux,Go,Httpserver,我有一个高流量服务器(超过800K qps)和go1.7 从我看到的8K goroutines中,有将近1800个在IO中等待几分钟。下面是这样一个goroutine堆栈 goroutine 128328653 [IO wait, 54 minutes]: net.runtime_pollWait(0x7f0fcc60c378, 0x72, 0x7cb) /usr/local/go/src/runtime/netpoll.go:160 +0x59 net.(*

我有一个高流量服务器(超过800K qps)和go1.7

从我看到的8K goroutines中,有将近1800个在IO中等待几分钟。下面是这样一个goroutine堆栈

    goroutine 128328653 [IO wait, 54 minutes]:
    net.runtime_pollWait(0x7f0fcc60c378, 0x72, 0x7cb)
      /usr/local/go/src/runtime/netpoll.go:160 +0x59
    net.(*pollDesc).wait(0xc4231d0a00, 0x72, 0xc42479fa20, 0xc42000c048)
      /usr/local/go/src/net/fd_poll_runtime.go:73 +0x38
    net.(*pollDesc).waitRead(0xc4231d0a00, 0x92f200, 0xc42000c048)
      /usr/local/go/src/net/fd_poll_runtime.go:78 +0x34
    net.(*netFD).Read(0xc4231d09a0, 0xc423109000, 0x1000, 0x1000, 0x0, 0x92f200, 0xc42000c048)
      /usr/local/go/src/net/fd_unix.go:243 +0x1a1
    net.(*conn).Read(0xc4234282b8, 0xc423109000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
      /usr/local/go/src/net/net.go:173 +0x70
    net/http.(*connReader).Read(0xc420449840, 0xc423109000, 0x1000, 0x1000, 0xc422b38b68, 0x100000000, 0xc421810601)
      /usr/local/go/src/net/http/server.go:586 +0x144
    bufio.(*Reader).fill(0xc422e22360)
      /usr/local/go/src/bufio/bufio.go:97 +0x10c
    bufio.(*Reader).Peek(0xc422e22360, 0x4, 0x7a066c, 0x4, 0x1, 0x0, 0x0)
      /usr/local/go/src/bufio/bufio.go:129 +0x62
    net/http.(*conn).readRequest(0xc422b38b00, 0x931fc0, 0xc424d19440, 0x0, 0x0, 0x0)
      /usr/local/go/src/net/http/server.go:762 +0xdff
    net/http.(*conn).serve(0xc422b38b00, 0x931fc0, 0xc424d19440)
      /usr/local/go/src/net/http/server.go:1532 +0x3d3
    created by net/http.(*Server).Serve
      /usr/local/go/src/net/http/server.go:2293 +0x44d
有人面临过这个问题吗?
任何一个指针都很感激

这些可能是发起请求但从未完成的客户端,或是速度较慢的客户端等

您应该配置服务器的读/写超时(分别为):


究竟是什么问题?是否要关闭活动连接?您是否设置了超时,以便无响应的客户端不会占用连接?@JimB如何在golang的服务器端设置连接超时。我知道客户方面的情况。我用http启动服务器。ListenAndServe@VishalKumar抄袭。修改以设置、WriteTimeout…的值以确保完整性将http.ListenAndServe(“:port”,r)更改为s:=&http.Server{Addr::port”,处理程序:r,ReadTimeout:somesec*时间。秒,WriteTimeout:sonesec*时间。秒,MaxHeaderBytes:1
s := new(http.Server)
// ...
s.ReadTimeout = 5 * time.Second
s.WriteTimeout = 5 * time.Second
// ...