【问题标题】:golang unix socket error. dial: resource temporarily unavailablegolang unix 套接字错误。 dial:资源暂时不可用
【发布时间】:2015-05-14 02:53:12
【问题描述】:

所以我正在尝试使用带有 fluentd 的 unix 套接字来执行日志记录任务并随机发现它,偶尔会出现错误

拨号:{socket_name} 资源暂时不可用

关于为什么会发生这种情况的任何想法?

我尝试添加“重试”逻辑以减少错误,但有时仍会发生。

此外,对于 Fluntd,我们使用默认配置进行 unix 套接字通信

func connect() {

var connection net.Conn
var err error
for i := 0; i < retry_count; i++ {
    connection, err = net.Dial("unix", path_to_socket)
    if err == nil {
        break

    }
    time.Sleep(time.Duration(math.Exp2(float64(retry_count))) * time.Millisecond)
}
if err != nil {
    fmt.Println(err)

} else {
        connection.Write(data_to_send_socket)

    }
     defer connection.Close()
}

【问题讨论】:

  • 大概是Dial函数调用了connect(2),如果路由缓存满了可以返回EAGAIN。您可能正在超载套接字堆栈。尝试切换到指数退避(即每次重试时将retry_duration 加倍)。
  • 服务器进程的listen 队列是否已满?

标签: sockets unix go


【解决方案1】:

Go 以非阻塞模式创建其套接字,这意味着某些系统调用通常会阻塞。在大多数情况下,它通过等待套接字准备好读/写来透明地处理EAGAIN 错误(由“资源暂时不可用”消息指示)。不过,Dial 中的 connect 调用似乎没有这种逻辑。

如果监听队列已满,connect 连接到 UNIX 域套接字时可能会返回 EAGAIN。如果客户端连接到它的速度快于接受它们的速度,就会发生这种情况。在这种情况下,Go 可能应该在套接字上等待直到它变得可连接,然后重试类似于它对 Read/Write 所做的操作,但它似乎没有这种逻辑。

因此,最好的办法是通过等待并重试Dial 调用来处理错误。或者找出您的服务器没有及时接受连接的原因。

【讨论】:

    【解决方案2】:

    对于指数退避,您可以使用此库:github.com/cenkalti/backoff。我认为你现在拥有它的方式总是会睡相同的时间。

    对于网络错误,您需要检查它是否是临时错误。如果是则重试:

    type TemporaryError interface {
        Temporary() bool
    }
    
    func dial() (conn net.Conn, err error) {
        backoff.Retry(func() error {
            conn, err = net.Dial("unix", "/tmp/ex.socket")
            if err != nil {
                // if this is a temporary error, then retry
                if terr, ok := err.(TemporaryError); ok && terr.Temporary() {
                    return err
                }
            }
            // if we were successful, or there was a non-temporary error, fail
            return nil
        }, backoff.NewExponentialBackOff())
        return
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2010-11-21
      • 2022-01-01
      • 2011-01-23
      • 2013-07-10
      相关资源
      最近更新 更多