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

124

Je suis en cours topd' exécution pour surveiller les performances de mon serveur et deux de mes processus java affichent une mémoire virtuelle allant jusqu'à 800 Mo-1 Go. Est-ce une mauvaise chose?

Qu'est-ce que la mémoire virtuelle signifie?

Et oh btw, j'ai swap de 1 Go et il montre 0% utilisé. Donc je suis confus.

Processus Java = 1 serveur Tomcat + mon propre démon java Server = Ubuntu 9.10 (karmic)

Kapso
la source

Réponses:

142

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 en réalité stocké sur le disque, mais il occupe tout de même un "espace adresse" dans le processus.

L'espace d'adressage (c'est-à-dire la mémoire virtuelle dans la liste de 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 votre mémoire réelle occupée par un processus.

Mais même cela n'est pas la solution. Si un processus appelle fork (), il se scinde en deux parties, qui partagent toutes les deux leurs flux RSS. Ainsi, même si le format RSS était initialement de 1 Go, le résultat après le forking serait deux processus, chacun avec un flux RSS de 1 Go, mais vous n'utiliseriez toujours que 1 Go de mémoire.

Encore confus? Voici ce que vous devez vraiment savoir: utilisez la freecommande et vérifiez les résultats avant et après le démarrage de votre programme (sur la +/- buffers/cacheligne). Cette différence est la quantité de nouvelle mémoire de votre programme récemment commencé à utiliser.

Apenwarr
la source
2
"Vérifier les résultats avant et après le démarrage de votre programme", utilisez alternativement USS (Unique Set Size) tel que retourné par smem.
Hubert Kario
Existe-t-il donc un outil donnant la quantité réelle de mémoire utilisée, des outils qui ne sont pas des tiers?
CMCDragonkai
@CMCDragonkai Oui, gratuit.
deviantfan
1
Si je lance un processus java via java -Xmx16g RunLong, qui réserverait 16 Go de mémoire pour le processus java VIRT, il semblerait que le 16 Go soit compté. Dans ce cas, quel est le type de cette mémoire de 16 Go, s'agit-il d'une mémoire mappée ou ..?
Eric Wang
1
@ EricWang, cette mémoire n'est pas mappée. C'est juste une demande au système d'exploitation de réserver de la mémoire qui pourrait être nécessaire plus tard (peut-être jamais). (Au moins) sous Linux, il s'agit d'un appel mmap avec les indicateurs MAP_NORESERVE et PROT_NONE (voir os :: appels pd_reserve_memory anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); aucune mémoire n'est réellement allouée par défaut - cela n'est fait que plus tard au moment où le programme a réellement besoin de mémoire pour satisfaire les demandes d'allocation d'objets.
Juraj Martinka
23

Depuis la page de manuel du haut (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 résidente (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, ce qui peut ou non consommer encore de la RAM réelle. Cette mémoire est sauvegardée dans un fichier mais n'est pas vraiment échangée.

VIRT inclut également des pages allouées mais non encore utilisées. Toute page dans cet état est mappée sur la Zero Page du noyau (concept génial - vous devriez la rechercher) afin qu’elle apparaisse dans VIRT mais ne consomme en réalité aucune mémoire.

amphétamachine
la source
2
Et bien, c’est intéressant, donc VIRT = SWAP + RES, comment se fait-il que mon utilisation de SWAP soit nulle, alors que la mémoire virtuelle pour les 2 processus java est proche de 1 Go?
Kapso
Top shows essentiellement .... Swap: 1048568k total, 0k utilisé, 1048568k gratuit, 505728k caché
kapso
15
@ user42159 Cette réponse est fausse! Il n'y a pas de 'VIRT = SWAP + RES' chez man top! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. Dommage que je ne puisse pas abaisser cette réponse.
duleshi
3
Cette réponse est incorrecte. USED ​​= Res + Swap Size (à partir de la partie supérieure de la gestion des champs, accessible en appuyant sur la touche f quand elle est en haut. Egalement à partir de la page de manuel supérieure).
Jason S
15

J'ai trouvé cette explication de Mugurel Sumanariu très claire:

VIRTreprésente la taille virtuelle d'un processus, qui correspond à la somme de mémoire qu'il utilise réellement, de mémoire qu'il a mappée sur lui-même (par exemple, la mémoire vive de la carte vidéo pour le serveur X), de fichiers sur disque qui ont été mappés sur celui-ci (la plupart 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 est capable d’accéder au moment présent.

RESreprésente la taille du résident, qui est une représentation précise de la quantité de mémoire physique réelle consommée par un processus. (Cela correspond également directement à la colonne% MEM.) Cela sera pratiquement toujours inférieur à la taille de VIRT, car la plupart des programmes dépendent de la bibliothèque C.

SHRindique combien de la taille de VIRT est réellement partageable (mémoire ou bibliothèques). Dans le cas des bibliothèques, cela ne signifie pas nécessairement que toute la bibliothèque est résidente. Par exemple, si un programme utilise seulement quelques fonctions dans une bibliothèque, toute la bibliothèque 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 réellement chargées et comptées. sous RES.

Franck Dernoncourt
la source
Je ne dirais peut-être que "VIRT représente la quantité de mémoire à laquelle le programme est capable d'accéder à l'heure actuelle". à quelque chose comme "VIRT représente la taille de la totalité de l'espace adressable du programme au moment présent". OK, ça pourrait encore utiliser du vernis. Mais le fait est que "combien de mémoire" peut encore donner l'impression que nous parlons de RAM, alors que VIRT n'a rien à voir avec de l'espace RAM. En fait, les programmes volumineux auront souvent une taille VIRT représentant plusieurs MULTIPLES de la taille totale de la RAM système, car ce dernier est presque entièrement composé de régions d'adresses sauvegardées sur fichier (AKA "disk not RAM").
FeRD
5

La colonne VIRT dans la sortie ps / top est presque inutile pour mesurer l'utilisation de la mémoire. Ne t'inquiète pas pour ça. Apache charge lourde VIRT vs mémoire RES

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

Leonbloy
la source
Merci, je me suis inquiété et confus, car alors que l'utilisation de swap était de 0%, la colonne de mémoire virtuelle est très élevée. Et aussi je n'ai que 1,7 Go de la mémoire physique totale de 2,7 Go utilisée, alors que la mémoire virtuelle est haute?
Kapso
2

Linux prend en charge la mémoire virtuelle, c’est-à-dire l’utilisation d’un disque en tant qu’extension de la mémoire vive de sorte que la taille effective de la mémoire utilisable augmente en conséquence. Le noyau écrira le contenu d'un bloc de mémoire inutilisé sur le disque dur afin que la mémoire puisse être utilisée à d'autres fins. Lorsque le contenu d'origine est à nouveau utilisé, il est lu en mémoire. Tout cela est rendu complètement transparent pour l'utilisateur; les programmes fonctionnant sous Linux ne voient que la quantité de mémoire disponible la plus importante et ne remarquent pas que certaines parties résident de temps en temps sur le disque. Bien sûr, la lecture et l’écriture du disque dur sont plus lentes (environ mille fois moins) que l’utilisation de la mémoire réelle, de sorte que les programmes ne tournent pas aussi vite. La partie du disque dur utilisée comme mémoire virtuelle est appelée espace de permutation.

Linux peut utiliser soit un fichier normal dans le système de fichiers, soit une partition séparée pour l’espace de permutation. 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 tout le disque dur et, éventuellement, de tout installer à partir de zéro). Lorsque vous savez combien d’espace de swap dont vous avez besoin, vous devriez choisir une partition de swap, mais en cas de doute, vous pouvez d’abord utiliser un fichier swap, puis utiliser le système pendant un certain temps pour avoir une idée de la quantité de swap utilisée. besoin, puis faites une partition de swap lorsque vous êtes sûr de sa taille.

Vous devez également savoir que Linux permet d'utiliser plusieurs partitions et / ou fichiers d'échange en même temps. Cela signifie que si vous avez rarement besoin d'une quantité inhabituelle d'espace d'échange, vous pouvez configurer un fichier d'échange supplémentaire à ce moment-là, au lieu de conserver la totalité du montant alloué en permanence.

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

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

utilisateur42198
la source
1
Cette réponse répand l'idée fausse selon laquelle la mémoire virtuelle est la même chose que l'échange ou la pagination. L'utilisation du disque en tant qu'extension de la RAM précède la mémoire virtuelle. Et de nombreux systèmes (tels que la plupart des routeurs SoHo) disposent d'une mémoire virtuelle mais n'utilisent pas le disque comme extension de la mémoire vive. (Et ce n'est pas non plus la réponse à la question du PO, puisqu'il n'utilise aucun échange.)
David Schwartz
2

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

La raison de la différence, entre les deux, peut être comprise à l’aide de l’exemple: si le processus utilise une certaine bibliothèque, la taille de la bibliothèque contribuera également au virtual-size. cependant, étant donné que seulement une partie de la bibliothèque serait utilisée (c’est-à-dire certaines méthodes utilisées), cela facilitera la tâche resident-size.

Reportez-vous pour plus d'informations

parasite
la source
0

"VIRT" ne représente qu'un espace d'adressage, RES est la "vraie" mémoire, mais la quantité "SHR" (= partagée) de "RES" est la partie de RES partagée avec d'autres processus. Donc, pour la plupart des processus, je pense qu'en soustrayant SHR de RES, vous obtenez la quantité de mémoire réellement attribuable à ce processus particulier.

Max
la source