Mysql: Obtido "discar tcp 127.0.0.1:3306: conectar: ​​não é possível atribuir o endereço solicitado" ao usar vários goroutines simultâneos

Criado em 17 jan. 2019  ·  3Comentários  ·  Fonte: go-sql-driver/mysql

Descrição do problema

Recebi "discar tcp 127.0.0.1:3306: conectar: ​​não é possível atribuir o endereço solicitado" depois de algum tempo, ao usar vários goroutines simultâneos:

  • Ao usar 8 goroutines simultâneas => tudo está OK
  • Ao usar mais goroutines => após cerca de 15s, cada solicitação falha com err = "disque tcp 127.0.0.1:3306: conectar: ​​não é possível atribuir o endereço solicitado". Cerca de 35.000 solicitações foram realizadas com sucesso antes da primeira falha.

Parece que o driver sql não pode obter uma nova porta para estabelecer uma nova conexão, mas se sim, não entendo por que ele não reutiliza uma conexão existente do pool?

Eu tenho os seguintes DBStats quando o erro acontece:
(sql.DBStats) {
MaxOpenConnections: (int) 0,
OpenConnections: (int) 64,
InUse: (int) 64,
Inativo: (int) 0,
WaitCount: (int64) 0,
WaitDuration: (time.Duration) 0s,
MaxIdleClosed: (int64) 28252,
MaxLifetimeClosed: (int64) 0
}

Eu uso go-sql-driver V1.4.1 com go 1.11.2, para alcançar um mariaDB rodando localmente como um contêiner docker.
No exemplo abaixo adicionei o "pânico" apenas para não ser inundado por um monte de erros semelhantes.

Código de exemplo

// the below code is called repetitly from a configurable number of worker fed using channels (fan-out)
// Mark visa_card entry as migrated
        query := fmt.Sprintf(UPDATE visa_card SET migrated=TRUE WHERE id_card=%s, this.idCard)
        _, err = conf.MySql.ExecContext(ctx, query)
        if err != nil {
            log.Error(ctx, log.EventTypeBusiness, "", err)
            spew.Dump(conf.MySql.Stats())
            panic("the END")
        }
        return err

Log de erros

{"level":"info","dateTime":"2019-01-17T14:58:04.095+0100","msg":"","appVersion":"0.0.0","component":"VISA-MIGRATOR","country":"bw","eventType":"incoming request","requestId":"d25e58f8-8228-4a7f-9cc4-1fd9ea2230b4","useCase":"","parameters":{"request_headers":{},"request_http_method":"POST","request_uri":"/startImportActiveCards"},"caller":"common/utils/log/ginLog.go:70"}
{"level":"error","dateTime":"2019-01-17T14:58:20.562+0100","msg":"","appVersion":"0.0.0","component":"VISA-MIGRATOR","country":"bw","eventType":"internal","requestId":"d25e58f8-8228-4a7f-9cc4-1fd9ea2230b4","useCase":"startMigration","peer":"internal","caller":"migrator/migrate/migrateActiveCards.go:211","errorDetails":"dial tcp 127.0.0.1:3306: connect: cannot assign requested address"}
(sql.DBStats) {
 MaxOpenConnections: (int) 0,
 OpenConnections: (int) 50,
 InUse: (int) 50,
 Idle: (int) 0,
 WaitCount: (int64) 0,
 WaitDuration: (time.Duration) 0s,
 MaxIdleClosed: (int64) 28258,
 MaxLifetimeClosed: (int64) 0
}
panic: the END

Configuração

* go-sql-driver V1.4.1

* Versão Go: versão go go1.11.2 linux / amd64

* MariaDB 10.4.1 no contêiner docker

Sistema operacional do servidor: por exemplo, Debian 8.1 (Jessie), Windows 10

Comentários muito úteis

Experimente isso.

db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (time.Minure)

Todos 3 comentários

Experimente isso.

db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (time.Minure)

Muito obrigado @methane por sua resposta rápida, o teste foi um sucesso!
Ainda estou um pouco surpreso que os valores padrão não funcionem corretamente e não entendo o porquê, mas de fato você resolveu meu problema.

Veja este artigo.
http://techblog.en.klab-blogs.com/archives/31093990.html

Todas as imagens do artigo desapareceram. Eles estão vivos na versão japonesa do artigo.

http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

xuewindy picture xuewindy  ·  3Comentários

Dieterbe picture Dieterbe  ·  6Comentários

zhaohui-kevin picture zhaohui-kevin  ·  5Comentários

BSick7 picture BSick7  ·  8Comentários

posener picture posener  ·  6Comentários