Mysql: Vous avez « dial tcp 127.0.0.1:3306 : connect : impossible d'attribuer l'adresse demandée » lors de l'utilisation de plusieurs goroutines simultanées

Créé le 17 janv. 2019  ·  3Commentaires  ·  Source: go-sql-driver/mysql

Description du problème

J'ai obtenu « dial tcp 127.0.0.1:3306 : connect : impossible d'attribuer l'adresse demandée » après un certain temps, lors de l'utilisation de plusieurs goroutines simultanées :

  • Lors de l'utilisation de 8 goroutines simultanées => tout va bien
  • Lors de l'utilisation de plus de goroutines => après environ 15s, chaque requête échoue avec err="dial tcp 127.0.0.1:3306: connect: impossible d'attribuer l'adresse demandée". Environ 35 000 requêtes ont été exécutées avec succès avant le premier échec.

On dirait que le pilote sql ne peut pas obtenir un nouveau port pour établir une nouvelle connexion, mais si c'est le cas, je ne comprends pas pourquoi il ne réutilise pas une connexion existante du pool ?

J'ai les DBStats suivants lorsque l'erreur se produit :
(sql.DBStats) {
MaxOpenConnections : (int) 0,
Connexions ouvertes : (int) 64,
En cours d'utilisation : (int) 64,
Inactif : (int) 0,
WaitCount : (int64) 0,
WaitDuration : (time.Duration) 0s,
MaxIdleClosed : (int64) 28252,
MaxLifetimeClosed : (int64) 0
}

J'utilise go-sql-driver V1.4.1 avec go 1.11.2, pour atteindre une mariaDB s'exécutant localement en tant que conteneur docker.
Dans l'exemple ci-dessous, j'ai ajouté la "panique" uniquement pour ne pas être inondé par un tas d'erreurs similaires.

Exemple de code

// 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

Journal des erreurs

{"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

Configuration

* go-sql-driver V1.4.1

*Version go : go version go1.11.2 linux/amd64

*MariaDB 10.4.1 dans un conteneur Docker

Système d'exploitation du serveur : par exemple Debian 8.1 (Jessie), Windows 10

Commentaire le plus utile

Essaye ça.

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

Tous les 3 commentaires

Essaye ça.

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

Merci beaucoup @methane pour votre réponse très rapide, l'essai est réussi !
Je suis quand même un peu surpris que les valeurs par défaut ne fonctionnent pas correctement et je ne comprends pas pourquoi mais effectivement vous avez résolu mon problème.

Voir cet article.
http://techblog.en.klab-blogs.com/archives/31093990.html

Toutes les images de l'article ont disparu. Ils sont vivants dans la version japonaise de l'article.

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

Cette page vous a été utile?
0 / 5 - 0 notes