3 votes

Linux : quel processus a consommé toute la mémoire ?

Nous disposons de 4 Go sur notre serveur linux mais nous ne pouvons actuellement utiliser que ~1,8 Go pour notre serveur java, qui est le premier processus java indiqué ci-dessous. (200 Mo sont libres, nous pouvons donc utiliser au maximum 1,6 Go + 0,2 Go).

La machine se bloque lorsque nous en utilisons davantage. Nous avons donc spécifié -Xmx1600m et -XX:MaxPermSize=200m pour limiter la RAM du serveur à 1,8 Go. Mais nous avons besoin de plus de RAM ! Où est passée la RAM restante ?

Voici le résultat du programme, trié en fonction de l'utilisation de la mémoire (via le grand 'M') :

Mem:   4083952k total,  3857856k used,   226096k free,   169320k buffers
Swap:  2104504k total,      176k used,  2104328k free,  1939080k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                           
28155 root      16   0 1835m 1.6g 7848 S    2 40.5  47:36.26 java                                                                                              
19609 root      16   0 45996 7052 3148 S    0  0.2  14:35.97 httpd2-prefork                                                                                    
 6802 root      16   0 46132 5916 1932 S    0  0.1   0:00.09 httpd2-prefork                                                                                    
 6866 root      15   0 46132 5916 1932 S    0  0.1   0:00.07 httpd2-prefork    

Comme vous pouvez le voir, il y a beaucoup (et même plus) de processus httpd2-prefork. Mais même si j'accumule les octets (25* ~46KB = ~1MB), il n'atteindra jamais cette taille.

free -m des empreintes :

             total       used       free     shared    buffers     cached
Mem:          3988       3768        219          0        165       1894
-/+ buffers/cache:       1708       2279
Swap:         2055          0       2055

Où est mon erreur ? Puis-je régler le serveur pour donner plus de RAM au processus Java ?

BTW : nous n'utilisons pas une machine virtuelle comme ici

Mise à jour

Comme cela a été souligné dans les commentaires : c'est un noyau 32 bits seulement :-( (via uname -a). Je ne peux donc utiliser que 3 Go au moins ? Mais le serveur lui-même semble être en 64 bits ? A cause du lm (long mode) dans la sortie ?

grep flags /proc/cpuinfo
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
...

Aquí est une autre question très similaire.

10voto

Janne Pikkarainen Points 31244

Ah, je vois que vous vous êtes trompé sur la façon de calculer la RAM libre sous Linux.

Linux a tendance à utiliser toute la mémoire vive en mettant des choses en cache. Au lieu de lire la liste des répertoires sur le disque à chaque fois, il met en cache les entrées des répertoires dans la RAM. Il met en cache les fichiers fréquemment utilisés, afin qu'ils n'aient pas besoin d'être chargés depuis le disque à chaque fois. Si un processus a réellement besoin de la RAM pour son utilisation, le cache sera immédiatement évincé.

La formule pour calculer la RAM réellement utilisée est donc la suivante total - (libre + tampons + cache) dans votre cas 3988 - (219 + 165 + 1894) ou en d'autres termes 3988 - 2278 . C'est-à-dire 1710 mégaoctets de RAM utilisés et 2278 mégaoctets de RAM pour que vous puissiez encore les consommer.

Vous ne me croyez pas ? Regardez, votre serveur n'a même pas de swap utilisé. :)

Mais bien sûr, un crash machine -- si vous voulez dire un blocage dur -- est une chose étrange. Cela ne devrait vraiment pas arriver. Je soupçonne une clé de RAM défectueuse qui n'est accessible qu'en cas d'utilisation de >2 Go de RAM.

2voto

automatonic Points 2830

Je ne vois que des options de processeurs plus anciens, donc je soupçonne que vous n'avez qu'un processeur 32 bits, mais vous devriez être en mesure d'utiliser les 4 Go, bien que vous ayez besoin d'étudier comment faire pour que cela fonctionne comme vous le souhaitez (vous pourriez avoir besoin d'activer PAE, par exemple).

Et vous voulez dire que l'application Java se plante, ou la machine entière ? La machine ne devrait pas se bloquer (bien qu'elle puisse ne plus répondre pendant un moment).

1voto

Juste une note - il y a une erreur dans les maths.

(25* ~46KB = ~1MB) doit être lu comme (25* ~46000KB = ~1150MB) .

La taille des ressources est cependant plus importante car elle donne une lecture plus réaliste de la mémoire par processus.

(25*~5000KB = ~125MB)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X