Maison > développement back-end > Golang > Pourquoi mon serveur Go 1.3 ne libère-t-il pas la mémoire au système d'exploitation ?

Pourquoi mon serveur Go 1.3 ne libère-t-il pas la mémoire au système d'exploitation ?

DDD
Libérer: 2025-01-01 13:21:12
original
455 Les gens l'ont consulté

Why Doesn't My Go 1.3 Server Release Memory Back to the OS?

Go 1.3 Garbage Collector Rétention de la mémoire du serveur

Comprendre le problème

Un serveur TCP gérant des connexions avec un trafic irrégulier utilise des quantités importantes de mémoire système qui n'est pas renvoyé au système d'exploitation. Ce comportement devient problématique lors de l'exécution de plusieurs serveurs sur la même machine, car les ressources mémoire peuvent s'épuiser avec le temps.

Arrière-plan

Le garbage collector (GC) de Go libère la mémoire tas inutilisée, mais ce n'est pas le cas. Cela ne réduit pas toujours l'espace d'adressage virtuel du processus. Sur les plateformes Windows, cela n'est pas possible. Même sur les systèmes basés sur Unix, Go utilise un appel système pour informer le système d'exploitation que la mémoire tas inutilisée peut être récupérée, mais cela prend du temps (jusqu'à 7 minutes).

Analyse

Basée sur Selon les informations recueillies sur les forums de la communauté Go, le problème peut être lié aux facteurs suivants :

  • Go ne libère pas toute la mémoire vers le OS : Go ne publie que les variables de tas ; les piles de goroutines ne sont pas libérées.
  • Libération de mémoire retardée : La mémoire ne peut pas être restituée au système d'exploitation immédiatement après avoir été marquée comme libre par le GC. Un balayage du système d'exploitation est également requis, ce qui peut prendre jusqu'à 7 minutes.
  • Utilisation surestimée de la mémoire : Toute la mémoire allouée n'est pas une « vraie » mémoire. Certains peuvent être utilisés par le moteur d'exécution mais pas par le programme, ce qui laisse le soin au système d'exploitation de s'en occuper.

Solutions potentielles

  • Libération de mémoire explicite : Forcer les déchets collection avec runtime.GC() et libérez explicitement de la mémoire sur le système d'exploitation en utilisant runtime.FreeOSMemory.

Limitations

  • runtime.GC() doit être utilisé avec parcimonie, car cela peut avoir un impact sur les performances.
  • runtime.FreeOSMemory ne fonctionne que si le GC a fonctionné.
  • La mémoire de la pile Goroutine ne sera pas publié.

Remerciements

  • Dmitri Vyukov (développeur Go) a fourni des informations clés sur le problème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal