Question Linux: découvrez quel processus utilise toute la RAM?


Avant de demander, pour être clair: oui, je connais le cache disque, et non, ce n’est pas mon cas :) Désolé, pour ce préambule :)

J'utilise CentOS 5. Chaque application du système échange beaucoup et le système est très lent. Quand je fais free -m, voici ce que j'ai eu:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Donc, je n'ai en fait que 42 Mo à utiliser! Pour autant que je sache, -/+ buffers/cache en fait ne compte pas le cache disque, donc je n'ai en effet que 42 Mo, non? J'ai pensé que je pouvais me tromper, alors j'ai essayé de désactiver la mise en cache du disque et cela n'a eu aucun effet - l'image est restée la même.

Donc, j'ai décidé de savoir qui utilise toute ma RAM, et j'ai utilisé top pour ça. Mais, apparemment, il indique qu'aucun processus n'utilise ma RAM. Le seul processus dans mon top est MySQL, mais il utilise 0,1% de RAM et 400 Mo de swap. Même image lorsque j'essaie d'exécuter d'autres services ou applications - tous vont en échange, top indique que MEM n'est pas utilisé (0,1% maximum pour tout processus).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Redémarrer n'aide pas, et par leur chemin est très lente, ce à quoi je ne m'attendrais normalement pas sur cette machine (4 cœurs, 4 Go de RAM, RAID1).

Donc, avec cela - je suis assez sûr que ce n'est pas un cache disque, qui utilise la RAM, car normalement il aurait dû être réduit et laisser d'autres processus utiliser la RAM, plutôt que de passer à l'échange.

Donc, enfin, la question est - si quelqu'un a des idées sur la façon de savoir quel processus utilise réellement la mémoire si lourdement?


99
2018-03-09 14:13


origine


Avez-vous déjà trouvé la réponse à cela? - Hackeron
@Hackeron: OP accepté cette réponse. Je sais que la réponse ne répond pas ta question, bien que. J'ai pu reproduire votre problème sur l'un de mes serveurs, et je recherche actuellement s'il existe un moyen de le résoudre. - Deltik
@Deltik Ah, d'accord. Merci :) - J'ai 2 serveurs ici qui libèrent toute la mémoire disponible en l'espace de 12 heures environ, faites le moi savoir si je peux faire quelque chose pour vous aider à diagnostiquer cela. Je suis joignable comme surnom "hackeron" sur IRC (irc.freenode.org). - Hackeron
@Hackeron: Je n'ai pas pu vous trouver comme "hackeron" sur irc.freenode.org. J'ai créé un salon de discussion pour une discussion prolongée ici. - Deltik


Réponses:


Sous Linux dans le top processus que vous pouvez appuyer sur < touche pour décaler le tri d'affichage de sortie à gauche. Par défaut, il est trié par le %CPU donc si vous appuyez sur la touche 4 fois, vous allez trier par VIRT qui est la taille de la mémoire virtuelle vous donnant votre réponse.

Une autre façon de faire est de:

ps -e -o pid,vsz,comm= | sort -n -k 2

devrait vous donner et la sortie triée par processus taille virtuelle.

Voici la version longue:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

89
2018-03-09 14:25



Ça me donne Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html sur le serveur Ubuntu 11.10. - Der Hochstapler
@OliverSalzburg Le problème est -o options RHEL4 cela fonctionne. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2 travaux. Je vais essayer 11.10 plus tard ce soir, mais si vous trouvez les bonnes options de tri, faites-le moi savoir. ps -e -o pid,vsz,comm | sort -n -k 2 pourrait fonctionner mais je n'ai pas de place pour vérifier pour le moment. - Karlson
Je ne connais pas vraiment le -ef option. Mais cela semble produire une production raisonnable: sudo ps axo pid,vsz,comm=|sort -n -k 2 - Der Hochstapler
@OliverSalzburg Désolé. Amended (pensé que je l'ai déjà changé). CA devrait etre ps -e ou ps -a - Karlson
Ty, j'aime la suggestion supérieure de < Je ne savais pas que c'était possible, fedora - SSH This


Affiche la mémoire de processus en mégaoctets et le chemin du processus.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

44
2018-02-09 21:12



Bienvenue sur Super User. Pouvez-vous développer votre réponse pour expliquer ce que fait ce code et comment il résout le problème? Le code inexpliqué est découragé, car il n'enseigne pas la solution. Merci. - fixer1234
Je suis surpris que cette réponse ait été abaissée et ait un commentaire demandant de l'expliquer. C'est assez court pour que ce soit clair (ça envoie des ps aux dans awk et on trie), et dans le contexte de la question, ça montre quels processus utilisent le plus de RAM. Je pense que c'est une bonne réponse. - John


Juste une note sur un serveur montrant les mêmes symptômes mais montrant toujours l'épuisement de la mémoire. Ce qui a fini par trouver était un fichier sysctl.conf à partir d'une boîte avec 32 Go de RAM et une configuration pour une base de données avec d'énormes pages configurées à 12000. Cette boîte ne contient que 2 Go de mémoire vive. 960 d'entre eux). Définir des pages énormes à 10, car aucune n'a été utilisée de toute façon, a libéré toute la mémoire.

Une vérification rapide de / proc / meminfo pour rechercher les paramètres HugePages_ peut être un bon début pour résoudre au moins un problème de mémoire inattendu.


13
2017-10-15 15:05



J'ai récemment eu un autre serveur où c'était le problème. Si votre entreprise compte d'anciens employés d'Oracle, ce paramètre peut être le coupable. - fields


Vous pouvez également utiliser la commande ps pour obtenir plus d'informations sur le processus.

ps aux | less

2
2017-07-08 06:05



Par curiosité, comment échapper à cette commande? Il montre END ocne j'atteins la dernière ligne, il ne tue pas le processus quand je Ctrl + C il. - KingsInnerSoul
@KingsInnerSoul presse 'q' - enobayram


Je référence ce et Mémoire totale utilisée par le processus Python? - débordement de pile, c'est ma réponse. Je reçois un outil de décompte de processus spécifique (python), maintenant.

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Joindre ma liste de processus.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Référence


1
2017-10-21 10:51





Dans mon cas, le problème était que le serveur était un serveur virtuel VMware avec vmw_balloonmodule activé:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Fonctionnement:

$ vmware-toolbox-cmd stat balloon
5189 MB

Ainsi, environ 5 Go de mémoire ont été récupérés par l'hôte. Donc, bien qu’ayant officiellement 8 Go pour ma machine virtuelle, dans la pratique, c’était beaucoup moins:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

1
2018-03-31 03:38





Faire un script appelé show-memory-usage.sh avec contenu:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

-1
2018-03-14 20:50



Pourquoi? Qu'est-ce que cela fait? Comment ça marche? Ne pas dire aux gens d'exécuter du code aléatoire; expliquer son but et son fonctionnement. - Michael Kjörling
Figure J'expliquerai le code pour ceux qui ne comprennent pas, car il semble être sûr à exécuter, mais la défaite peut écarter ceux qui seraient utiles. Il exécute la même commande que dans ci-dessus réponses, mais il ajoute le formatage avec AWK. Je n'ai pas personnellement lancé le script car je ne l'ai pas utilisé, mais l'expliquer aide ceux qui en ont besoin. - Dooley_labs