web-dev-qa-db-fra.com

Quelque chose mange toute la mémoire (je soupçonne une fuite de mémoire sur une application). Comment détecter quoi?

J'ai un serveur qui exécute le paquet liquidsoap + icecast et un site Web simple (httpd + mysqld). Rien de spécial. Visiteurs environ 2000+ par jour, avec environ 50 étant en ligne simultanément en moyenne.

Le serveur a 8 Go de RAM. Au fil du temps, la quantité de mémoire libre diminue constamment, bien que rien de nouveau ne soit démarré sur le serveur et qu'il n'y ait pas de nouveaux utilisateurs. À un moment donné, il commence à s'échanger, la charge sur le serveur augmente et il ne répond plus. Habituellement, je redémarre simplement le serveur ...

Que peut-on faire pour détecter ce qui fuit exactement la mémoire? J'utilise top pour surveiller l'utilisation des ressources, mais pour autant que je le vois, cela ne montre rien d'utile:

enter image description here

Existe-t-il un moyen de savoir ce qui utilise autant de mémoire? ou qu'est-ce qui commence à basculer lourdement sur le disque? Est-il possible de libérer de la mémoire sans redémarrer le serveur?

16
jayarjo

L'exécution de top en mode batch pour signaler périodiquement la taille de la mémoire peut être utilisée pour voir qui utilise la mémoire lorsque les choses tournent au sud. L'exécution sar en mode batch devrait fournir de bons diagnostics sur l'utilisation de la mémoire et les E/S associées. L'exécution de munin pour surveiller le système devrait vous donner un graphique avec de bons détails sur la mémoire utilisée. Cela peut aider beaucoup.

Vous pouvez utiliser limits.conf pour limiter la taille maximale du cœur des programmes. Correctement réglé, cela devrait tuer tous les programmes qui fuient la mémoire. Cela fonctionne avec le module pam_limits. Des limites peuvent également être définies avec la commande ulimits.

Vous exécutez quelques programmes qui pourraient utiliser de grandes quantités de mémoire. Certaines choses que vous pourriez regarder incluent.

  • Applications mal programmées fonctionnant sous Apache2 peut entraîner une fuite de mémoire. Vous devriez voir la taille de la mémoire augmenter lorsque cela se produit. Vous pouvez régler Apache2 pour recycler les enfants après un certain nombre d'utilisations en définissant MaxRequestsPerChild sur 100 ou plus. Si cela résout le problème, vous devez résoudre la fuite. Je regarderais cela en premier.
  • MySQL peut essayer de charger des données en mémoire. Si vous avez beaucoup de données en mémoire, cela peut provoquer des dégâts, mais ne devrait pas être aussi dramatique que vous le voyez.
  • Si un grand système de fichiers tmpfs est monté, vous risquez de perdre de la mémoire si les fichiers ne sont pas supprimés lors de leur utilisation. Les fichiers volumineux de longue durée peuvent également être un problème.
  • Si le problème se produit à peu près au même moment de la journée, vous pouvez avoir un programme planifié qui fuit la mémoire.
  • Si vous avez un programme qui alloue de la mémoire partagée, mais ne le libère pas avant de quitter, vous aurez une fuite de mémoire relativement invisible. Si la mémoire partagée est verrouillée en mémoire, cela peut forcer l'échange. La quantité de mémoire partagée disponible est généralement relativement limitée.
  • Le bundle liquidsoap + icecast peut rencontrer des problèmes de mise en mémoire tampon qui utilisent de la mémoire. Je n'ai pas utilisé cette combinaison, donc je ne sais pas comment cela apparaîtrait.

Utilisation normale de la mémoire: la mémoire libre n'est pas quelque chose dont vous voulez beaucoup. Si votre système fonctionne depuis longtemps et a beaucoup de mémoire libre, quelque chose ne va pas. Chaque fois que vous lisez ou écrivez un fichier, les blocs iront dans le cache tampon. Cela réduira votre mémoire libre et c'est une bonne chose. Le système gardera suffisamment d'espace libre pour démarrer quelques programmes sans chercher ailleurs la mémoire. Comme de nombreux programmes s'exécutent rapidement, leur mémoire sera renvoyée au pool libre à la fin de leur exécution.

Lorsque vous lisez un fichier qui se trouve dans le cache de tampon, aucun accès au disque n'est requis et la lecture est résolue à partir du cache de tampon. Les écritures utilisent un mécanisme similaire. Si votre système a besoin de mémoire, le cache tampon est l'un des premiers endroits utilisés. La plupart des tampons peuvent être libérés immédiatement.

Si vous avez une fuite de mémoire, vous verrez de la mémoire libre et des tampons commencer à rétrécir. Ce n'est toujours pas un problème grave, car la mémoire perdue devrait finalement être déplacée vers l'espace d'échange. Votre système fonctionnera toujours correctement jusqu'à ce que vous remplissiez l'espace de swap et tirez l'espace libre restant au point où les programmes ne peuvent pas être démarrés. Il est typique qu'une petite quantité d'espace d'échange puisse être utilisée.

16
BillThor

Vous pouvez utiliser cette commande pour voir les 10 meilleures applications concernant RAM usage:

ps -A --sort -rss -o comm,pmem | head -n 11

Parfois, cette commande vous aide si de nombreux sous-processus ont été générés:

ps auxf

De cette façon, vous pouvez voir quels processus vont ensemble.

11
Raffael Luthiger

Rien n'utilise vraiment cette mémoire en termes d'applications.

Vous devez déduire la valeur "mise en cache" qui représente le cache de page pour avoir une meilleure idée de votre utilisation réelle de la mémoire en termes d'utilisation du programme.

Fondamentalement, c'est une bonne gestion de la mémoire et c'est idéalement ce que vous voulez.

Voir le lien ici pour plus d'informations: http://www.linuxatemyram.com/

8
Matthew Ife

Je ne suis pas vraiment un pro, mais le savon liquide + icecast est lié au multimédia. Lorsque le système est libre, il met en cache et/ou occupe la mémoire pour une utilisation future. Et si le trafic augmente à un certain moment de la journée/sur une période de temps, il commencera à échanger. À ce stade, si les demandes (utilisateurs visualisant du contenu) augmentent, les ressources nécessaires seront supérieures à 8 Go de RAM.

1
Yash