Optimiser le garbage collection Go avec GOGC et GOMEMLIMIT

texier-denis 02/05/2026
RÉSOLU

Salut à tous. J'ai un service Go qui tourne en conteneur avec une limite mémoire assez stricte (2Go). Je constate des pics d'utilisation mémoire et des latences de GC qui tuent mes perfs. J'ai essayé de jouer avec GOGC mais c'est un compromis difficile entre CPU et RAM.

Est-ce que l'utilisation de GOMEMLIMIT est devenue le standard pour éviter l'OOM Killer sans pour autant sacrifier tout le throughput ? Voici mes settings actuels :

export GOGC=100
export GOMEMLIMIT=1800MiB
02/05/2026 à 07:01

11 commentaires

christine16
Membre
Avatar de christine16
christine16
Membre

Le problème de GOGC seul, c'est que ça ne tient pas compte des allocations hors-tas. GOMEMLIMIT est un game changer depuis Go 1.19.

03/05/2026 à 03:37

C'est ce que je pensais, mais j'ai peur que le GC s'emballe si la limite est trop proche du pic d'utilisation.

03/05/2026 à 18:43
manon81
Membre
Avatar de manon81
manon81
Membre

Si ton application est très sensible à la latence, baisse légèrement ton GOMEMLIMIT à 90% de la limite conteneur pour laisser de la marge au runtime.

04/05/2026 à 15:44
thomas-henry
Membre Actif Secouriste
Avatar de thomas-henry
thomas-henry
Membre Actif Secouriste

Exactement, et n'oublie pas de vérifier tes métriques go_memstats_heap_alloc_bytes pour voir si tu n'as pas une fuite lente avant de blâmer le GC.

05/05/2026 à 07:02

Bonne idée, je vais monitorer ça sur 24h avec Prometheus.

06/05/2026 à 06:11
christine16
Membre
Avatar de christine16
christine16
Membre

Regarde aussi si tu n'as pas des allocations massives sur la stack, le GC ne les gère pas pareil.

07/05/2026 à 05:21
manon81
Membre
Avatar de manon81
manon81
Membre

Une astuce : utilise pprof pour identifier les objets qui restent trop longtemps en vie.

07/05/2026 à 23:06

Je vais lancer un profilage heap dès demain matin.

08/05/2026 à 15:04
thomas-henry
Membre Actif Secouriste
Avatar de thomas-henry
thomas-henry
Membre Actif Secouriste

N'oublie pas de vérifier le paramètre debug.SetMemoryLimit si tu veux ajuster dynamiquement.

09/05/2026 à 12:03
christine16
Membre
Avatar de christine16
christine16
Membre

C'est plus propre de le faire via variable d'environnement pour éviter de recompiler.

10/05/2026 à 10:08

Je reste sur les variables d'env, c'est plus simple pour le déploiement. Merci pour les pistes !

11/05/2026 à 07:16

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