Debuguer les latences de lock contention sur Go en production

tmarty 03/05/2026
RÉSOLU
tmarty
Auteur Actif
Avatar de tmarty
tmarty
Auteur Actif

Salut à tous, j'ai une problématique assez spécifique sur un microservice écrit en Go. On observe des pics de latence P99 assez violents corrélés avec des phases de forte contention sur les mutex. J'ai utilisé go tool pprof et le graphe de blocage montre que nos goroutines passent un temps fou à attendre sur un sync.Mutex global dans notre couche de cache.

Avez-vous des retours sur l'utilisation de sync.Map ou du sharding de mutex pour limiter ce phénomène ? Ne pas verrouiller trop large semble être la règle, mais je cherche une approche plus fine pour diagnostiquer ce bottleneck sans impacter le débit.

03/05/2026 à 10:00

11 commentaires

laurent36
Membre Actif Secouriste
Avatar de laurent36
laurent36
Membre Actif Secouriste

La contention sur un mutex global est un classique. As-tu déjà vérifié si ton CPU est sous-exploité pendant ces phases ? Si oui, c'est clairement un problème de sérialisation.

03/05/2026 à 22:07
tmarty
Auteur Actif
Avatar de tmarty
tmarty
Auteur Actif

Oui, le CPU est stable, c'est vraiment l'attente sur le lock qui plombe tout. Le pprof indique runtime.semacquireMutex en tête de liste.

04/05/2026 à 10:11
dcarpentier
Membre
Avatar de dcarpentier
dcarpentier
Membre

Si ton cache est en lecture seule majoritaire, sync.RWMutex est préférable, mais si tu as beaucoup d'écritures, le sharding de ton cache est la seule solution viable. Voici un pattern classique pour découper ça :

type ShardedCache struct { shards []*Shard }
05/05/2026 à 08:36

Attention aussi au nombre de goroutines. Si tu as 10k goroutines qui se battent pour un seul lock, le scheduler Go va passer son temps à faire du context switching.

05/05/2026 à 22:12
tmarty
Auteur Actif
Avatar de tmarty
tmarty
Auteur Actif

Effectivement, le nombre de goroutines explose lors des pics. Je vais tester le sharding par hash de clé pour réduire la contention sur chaque shard.

06/05/2026 à 14:51
laurent36
Membre Actif Secouriste
Avatar de laurent36
laurent36
Membre Actif Secouriste

N'oublie pas d'utiliser GODEBUG=schedtrace=1000 pour monitorer les états des threads pendant que ça bloque.

07/05/2026 à 05:04
tmarty
Auteur Actif
Avatar de tmarty
tmarty
Auteur Actif

Bonne idée, je vais lancer ça en staging pour voir si je détecte des threads en mode syscall ou waiting prolongé.

08/05/2026 à 01:05
dcarpentier
Membre
Avatar de dcarpentier
dcarpentier
Membre

Et si tu peux, essaie d'utiliser des canaux pour gérer le flux au lieu des locks si la logique le permet.

08/05/2026 à 13:30
tmarty
Auteur Actif
Avatar de tmarty
tmarty
Auteur Actif

Les channels sur des structures de données complexes ça devient vite spaghetti. Je reste sur le sharding de mutex.

09/05/2026 à 06:25

C'est plus propre en effet. Tiens-nous au courant du delta de performance.

10/05/2026 à 04:41
tmarty
Auteur Actif
Avatar de tmarty
tmarty
Auteur Actif

Le sharding a réduit la P99 de 40%. La contention est répartie et les goroutines ne s'empilent plus. Problème résolu.

10/05/2026 à 19:53

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire