web-dev-qa-db-fra.com

Que signifie la taille de la mémoire virtuelle en haut?

J'exécute top pour surveiller les performances de mon serveur et 2 de mes processus Java affichent une mémoire virtuelle allant jusqu'à 800 Mo-1 Go. Est-ce une mauvaise chose?

Que signifie la mémoire virtuelle?

Et oh btw, j'ai un échange de 1 Go et cela montre 0% utilisé. Je suis donc confus.

Processus Java = 1 serveur Tomcat + le mien Java Daemon Server = Ubuntu 9.10 (karmic)

129
kapso

La mémoire virtuelle n'est même pas nécessairement de la mémoire. Par exemple, si un processus mappe en mémoire un fichier volumineux, le fichier est réellement stocké sur le disque, mais il occupe toujours "l'espace d'adressage" dans le processus.

L'espace d'adressage (c'est-à-dire la mémoire virtuelle dans la liste des processus) ne coûte rien; ce n'est pas vrai. Ce qui est réel, c'est la colonne RSS (RES), qui est la mémoire résidente. C'est la quantité de mémoire réelle qu'un processus occupe.

Mais même cela n'est pas la réponse complète. Si un processus appelle fork (), il se divise en deux parties, et les deux partagent initialement tous leurs flux RSS. Donc, même si RSS était initialement de 1 Go, le résultat après la fourche serait deux processus, chacun avec un RSS de 1 Go, mais vous n'utiliseriez toujours que 1 Go de mémoire.

Vous êtes encore confus? Voici ce que vous devez vraiment savoir: utilisez la commande free et vérifiez les résultats avant et après le démarrage de votre programme (sur le +/- buffers/cache ligne). Cette différence est la quantité de mémoire new utilisée par votre nouveau programme.

147
apenwarr

Depuis la page de manuel supérieure (1):

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

Où RES signifie mémoire RESident (mémoire physique utilisée).

En fait, ce n'est pas correct (plus). Quand il dit "swap", cela inclut également les fichiers que le programme a mappés dans son espace d'adressage, qui peut ou non consommer réellement RAM encore. Cette mémoire est sauvegardée sur fichier mais n'est pas 'échange pas vraiment.

VIRT comprend également des pages qui ont été allouées mais qui ne sont encore utilisées pour rien. Toute page dans cet état est mappée à la page zéro du noyau (concept génial - vous devriez la rechercher) donc elle apparaît dans VIRT mais ne consomme en fait aucune mémoire.

24
amphetamachine

J'ai trouvé cela explication de Mugurel Sumanari très clair:

VIRT représente la taille virtuelle d'un processus, qui est la somme de la mémoire qu'il utilise réellement, de la mémoire qu'il a mappée sur lui-même (par exemple, la carte vidéo RAM pour le Serveur X), les fichiers sur le disque qui y ont été mappés (notamment les bibliothèques partagées) et la mémoire partagée avec d'autres processus.VIRT représente la quantité de mémoire à laquelle le programme peut accéder à l'heure actuelle.

RES représente la taille résidente, qui est une représentation précise de la quantité de mémoire physique réelle qu'un processus consomme. (Cela correspond également directement à la colonne% MEM.) Elle sera pratiquement toujours inférieure à la taille VIRT, car la plupart des programmes dépendent de la bibliothèque C.

SHR indique quelle part de la taille VIRT est réellement partageable (mémoire ou bibliothèques). Dans le cas des bibliothèques, cela ne signifie pas nécessairement que la bibliothèque entière est résidente. Par exemple, si un programme n'utilise que quelques fonctions dans une bibliothèque, la bibliothèque entière est mappée et sera comptée dans VIRT et SHR, mais seules les parties du fichier de bibliothèque contenant les fonctions utilisées seront effectivement chargées et comptées sous RES.

18
Franck Dernoncourt

La colonne VIRT dans la sortie ps/top n'est presque pas pertinente pour mesurer l'utilisation de la mémoire. Ne t'en fais pas. Apache charge lourde VIRT vs mémoire RES

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-Java-under-linux-too-much-memory-used

5
leonbloy

VIRtual colonne du haut, fait référence au super-espace (espace de super-consommation) du processus, que le processus peut ne pas prendre réellement au moment de l'exécution. Il existe une autre colonne RESident, qui fait référence à la mémoire/espace physique réel alloué par le processus, au moment de l'exécution.

La raison de la différence, entre les deux, peut être comprise par l'exemple: si le processus utilise une certaine bibliothèque, la taille de la bibliothèque aidera également le virtual-size. cependant, puisque seule une partie de la bibliothèque serait utilisée (c'est-à-dire certaines méthodes utilisées), cela facilitera resident-size.

Référez-vous à Plus d'infos

2
parasrish

Linux prend en charge la mémoire virtuelle, c'est-à-dire en utilisant un disque comme extension de RAM pour que la taille effective de la mémoire utilisable augmente en conséquence. Le noyau écrira le contenu d'un bloc de mémoire actuellement inutilisé dans le disque dur afin que la mémoire puisse être utilisée à une autre fin. Lorsque le contenu d'origine est à nouveau nécessaire, il est relu en mémoire. Tout cela est rendu complètement transparent pour l'utilisateur; les programmes exécutés sous Linux ne voient que la plus grande quantité de mémoire disponibles et ne remarquent pas que certaines d'entre elles résident de temps en temps sur le disque. Bien sûr, la lecture et l'écriture du disque dur sont plus lentes (de l'ordre de mille fois plus lentes) que l'utilisation de la mémoire réelle, donc les programmes ne La partie du disque dur utilisée comme mémoire virtuelle est appelée espace de swap.

Linux peut utiliser soit un fichier normal dans le système de fichiers, soit une partition distincte pour l'espace d'échange. Une partition de swap est plus rapide, mais il est plus facile de changer la taille d'un fichier de swap (il n'est pas nécessaire de repartitionner l'intégralité du disque dur, et éventuellement d'installer tout à partir de zéro). Lorsque vous savez de combien d'espace de swap vous avez besoin, vous devriez opter pour une partition de swap, mais si vous n'êtes pas sûr, vous pouvez d'abord utiliser un fichier de swap, utilisez le système pendant un certain temps afin que vous puissiez avoir une idée de la quantité de swap que vous besoin, puis faites une partition d'échange lorsque vous êtes sûr de sa taille.

Vous devez également savoir que Linux permet d'utiliser plusieurs partitions de swap et/ou fichiers de swap en même temps. Cela signifie que si vous n'avez besoin qu'occasionnellement d'une quantité inhabituelle d'espace de swap, vous pouvez configurer un fichier de swap supplémentaire à ces moments, au lieu de garder le montant total alloué en permanence.

Remarque sur la terminologie du système d'exploitation: l'informatique fait généralement la distinction entre l'échange (écriture de l'ensemble du processus dans l'espace d'échange) et la pagination (écriture uniquement des pièces de taille fixe, généralement quelques kilo-octets à la fois). La pagination est généralement plus efficace, et c'est ce que fait Linux, mais la terminologie Linux traditionnelle parle de permutation de toute façon.

Source: http://www.faqs.org/docs/linux_admin/x1752.html

1
user42198

"VIRT" adresse simplement l'espace, RES est la mémoire "réelle", mais la quantité "SHR" (= partagée) de "RES" est la partie de RES qui est partagée avec d'autres processus. Donc, pour la plupart des processus, je crois qu'en soustrayant SHR de RES vous donne la quantité de mémoire qui est vraiment attribuable à ce processus particulier.

0
Max