【问题标题】:dial tcp : socket: too many open filesdial tcp : socket: 打开的文件太多
【发布时间】:2019-12-30 13:29:57
【问题描述】:

当我进行负载测试时,我得到 dial tcp : socket: too many open files 错误。通过设置 ulimit 其工作正常,但是否有任何其他解决方案而不设置 ulimit?

代码:

package main
import (
 "fmt"
 "io"
 "io/ioutil"
 "encoding/json"
 "net/http"
 )

type Struct_Response struct {
    Meta struct {
        Requestid        string
    }
} 

var HttpClient = &http.Client{}

func main(){
    apiUrl := "http://example.com"
    JsonStr :="teststr"
    conn_token :="1233333333333"
    req, err := http.NewRequest("POST", apiUrl, bytes.NewBuffer(JsonStr))
    if err!=nil{ 
        fmt.Println(err)
    }
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("requestid", "1234")
    req.Header.Set("Authorization", "Bearer "+conn_token)
    req.Header.Set("Connection", "close")

    resp, err := HttpClient.Do(req)
    req.Close=true
    if resp!=nil && resp.StatusCode==200 {
        body, _ := ioutil.ReadAll(resp.Body)
        var Responce Struct_Response
        err := json.Unmarshal([]byte(string(body)), &Responce)
        if err != nil {
            fmt.Println(err)
        }
        io.Copy(ioutil.Discard, resp.Body)
        resp.Body.Close()
    }
}

提前致谢。

【问题讨论】:

  • 不,没有。如果你达到了打开文件描述符的限制,唯一的办法就是增加限制。
  • @hobbs 你能建议我限制更少套接字的最佳方法吗?
  • 从错误来看,这听起来像是您的进程,或者在一般操作系统中(linux?)-打开了太多套接字。您可以通过查看ls /proc/$pid/fd.. 来验证这一点。跨度>

标签: go


【解决方案1】:

您的问题可能是您没有完全关闭连接,这会导致在重用 TCP 端口客户端端口号之前添加延迟。

在您上面的代码示例中,响应正文仅在状态为 200 时被消耗和关闭。您应该始终在响应正文出现时消耗/关闭响应正文。

【讨论】:

  • 如果状态!=200,那么我得到的响应为零。所以我无法关闭它
  • 尝试运行netstat -na,看看你是否有长输出。特别是,查找TIME_WAIT,如果您有很多,则表明存在未进行完全关闭握手的连接。这个TCP states 信息页面似乎说许多 TIME_WAIT 意味着它处于被动关闭转换中,并且在它影响性能之前没关系。如果可能的话,似乎你想要一个主动的关闭序列。
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多