2017-08-31 1 views
1

J'ai utilisé golang pour construire une passerelle api application en utilisant le proxy inverse golang, Mais je pouvais voir une augmentation progressive de la mémoire par le temps et j'ai essayé de profil, voici le graphique dans quelques heures après le démarrage. Y a-t-il quelque chose qui ne va pas ou est-ce prévu? Toutes les allocations se passent à partir de paquets intégrés et de negroni mux.Golang: Augmentation constante (Memory Leak) dans le tas alloué avec net/http,

enter image description here

Number of go routins

+2

Donc, après une heure d'utilisation active, votre serveur Web Go alloué et utilisé 30 Mo de RAM, et vous pensez que c'est beaucoup? Il n'y a rien de mal dans votre graphique. Il n'y a pas assez de données pour indiquer en toute sécurité qu'il y a une fuite de mémoire dans votre application. Essayez de profiler plus longtemps. En attendant vérifier cette réponse: [Golang - Ne peut pas libérer la mémoire une fois occupé par bytes.Buffer] (https://stackoverflow.com/questions/37382600/golang-cannot-free-memory-once-occupied-by-bytes-buffer/ 37383604 # 37383604). – icza

+1

Je l'ai vérifié ... et vu qu'il a augmenté progressivement après quelques jours à 1 Go de mémoire. Je ne suis pas inquiet à propos de l'utilisation de la mémoire, mais la mémoire inutilisée devrait nettoyer, soit 1 Mo, si elle n'est plus utilisée par l'application qu'elle devrait libérer. – Ysak

+2

Consultez également cette réponse pour obtenir des conseils pour éviter l'allocation de mémoire importante: [Libérer la mémoire inutilisée?] (Https://stackoverflow.com/questions/45509538/freeing-unused-memory/45509642#45509642) – icza

Répondre

5

En cours, suivi de vos applications afin que vous sachiez ce qui motive l'utilisation (nombre de demandes en cours, etc.), puis en corrélation que, avec l'utilisation des ressources (CPU, mémoire , nombre de goroutines qui existent actuellement, etc). Vous devriez avoir un modèle de cause à effet de l'utilisation de vos ressources d'application et surveiller les écarts importants. En résumé, adopter une approche systématique pour mesurer et surveiller l'utilisation des ressources.

Package runtime

import "exécution"

func NumGoroutine

func NumGoroutine() int

NumGoroutine retourne le nombre de goroutines qui existent actuellement.

Par exemple, surveiller et corréler le nombre de goroutines qui existent actuellement. Le nombre de goroutines doit osciller autour d'un état stable basé sur les principaux pilotes d'application, comme le nombre de demandes en cours.

Si vous ne terminez pas correctement les goroutines dans votre programme, elles deviennent orphelines. Goroutines orphelins conservent la mémoire, une fuite de mémoire goroutine. Vous devriez voir une augmentation constante de l'utilisation de la mémoire au fil du temps.

Quel est votre modèle de goroutine pour votre application? Quelles sont les statistiques de goroutine pour votre application? Est-ce qu'ils corrèlent avec la mémoire. Est-ce qu'ils corrèlent avec l'augmentation du temps?