拨打tcp addr:port:i / o超时,EOF和连接由同行重置

时间:2015-12-04 16:33:52

标签: go

您好我有一个简单的服务器设置,间歇性地出错,出现以下错误。

  
      
  • 拨tcp地址:port:i / o timeout
  •   
  • EOF
  •   
  • 通过对等方重置连接
  •   

客户代码:

request, err := http.NewRequest("POST", "http://someaddress/abc?key=somekey", bytes.NewReader(value))
if err != nil {
    return
}
request.Header.Set("Content-Type", "application/json")
request.Header.Set("Content-Length", strconv.Itoa(len(value)))
request.Header.Set("Connection", "Keep-Alive")

response, err := client.Do(request)
if response != nil {
    io.Copy(ioutil.Discard, response.Body)
    response.Body.Close()
}

服务器代码:

func HandleMe(response http.ResponseWriter, request *http.Request) {
    query := request.URL.Query()

    key := query.Get("key")
    if key == "" {
        response.Write(nil)
        return
    }

    body, err := ioutil.ReadAll(request.Body)
    if err != nil {
        response.Write(nil)
        return
    }

    index(key, string(body))
    response.Write(nil)
    return
}

索引函数基本上接受请求并添加到缓冲通道并立即返回。该通道具有100000个突发负载条目的容量。即使在突发负载的峰值时间内,通道也不会超过500个条目。在通道的另一侧是20名工作人员,他们在将处理过的数据添加到数据库之前对数据进行额外处理。

现在奇怪的问题是我偶尔会得到上面列出的3个错误。服务器进程在高峰时间每秒获得大约30k个请求。上面列出的三个错误每分钟发生2-3次,在绝大多数情况下,它的拨号tcp地址:端口:i / o超时问题。有谁碰巧知道我在这里做错了什么?

编辑: 该服务器上的一些统计信息

  

ss -s总计:648(内核0)TCP:547(确定528,关闭1,孤立   4,synrecv 0,timewait 0/0),端口0

     

传输总IP IPv6   * 0 - - RAW 0 0 0 UDP 12 9 3 TCP 546 31 515 INET 558 40
  518 FRAG 0 0 0

     

netstat -ant | awk'{print $ 6}'|排序| uniq -c |排序-n         1成立)         1外国人         4 LAST_ACK        14听        24 TIME_WAIT       234 SYN_RECV

0 个答案:

没有答案