Question Top - Que signifie taille de la mémoire virtuelle? … Linux / ubuntu


je cours top 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)


99
2018-05-04 15:37


origine


Voir: serverfault.com/questions/48582/… - Juliano


Réponses:


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 le free commande 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 combien Nouveau mémoire utilisée par votre programme que vous venez de démarrer.


119
2018-05-05 01:17



"Vérifier les résultats avant et après le démarrage de votre programme", utilisez alternativement USS (Unique Set Size) tel que renvoyé par smem. - Hubert Kario
Existe-t-il donc un outil qui indique la quantité réelle de mémoire utilisée, des outils qui ne sont pas des tiers? - CMCDragonkai
@CMCDragonkai Oui, gratuit. - deviantfan
Si je lance un processus java via java -Xmx16g RunLong, qui réserverait 16 Go de mémoire pour le processus java, puis VIRT de haut, il semble que le 16Gb est 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


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.


22
2018-05-04 15:43



bien thats intéressant, est 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 en cache - kapso
@ user42159 Cette réponse est fausse! Il n'y a pas de 'VIRT = SWAP + RES' dans le top man! -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
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


j'ai trouvé ça explication de Mugurel Sumanariu très clair:

VIRT représente la taille virtuelle d'un processus, qui est la somme de   qu’elle utilise réellement, la mémoire qu’elle a mappée sur elle-même (pour   exemple la RAM de la carte vidéo pour le serveur X), les fichiers sur le disque qui   ont été mappés dans celui-ci (notamment les bibliothèques partagées), et la mémoire   partagé avec d'autres processus. VIRT représente combien de mémoire le   programme est en mesure d'accéder au moment présent.

RES représente la taille du résident, ce qui est une représentation exacte   de la quantité de mémoire physique réelle consommée par un processus. (Ça aussi   correspond directement à la colonne% MEM.) Ceci va pratiquement toujours   être inférieure à la taille de VIRT, car la plupart des programmes dépendent du C   bibliothèque.

SHR indique combien de la taille de VIRT est réellement partageable (mémoire   ou des 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 seulement   utilise quelques fonctions dans une bibliothèque, la bibliothèque entière est mappée et   seront comptés dans VIRT et SHR, mais seulement les parties de la bibliothèque   fichier contenant les fonctions utilisées sera effectivement chargé dans   et être compté sous RES.


8
2018-01-27 17:53





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


5
2018-05-04 15:41



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


Linux prend en charge la mémoire virtuelle, c’est-à-dire qu’elle utilise un disque en tant qu’extension de la 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 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 devez 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 swap en même temps. Cela signifie que si vous avez besoin occasionnellement 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.

La source: http://www.faqs.org/docs/linux_admin/x1752.html


2
2018-05-04 15:43



Cette réponse répand l'idée fausse que 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


VIRtual La colonne du haut fait référence au super-espace (espace de super consommation) du processus, processus que le processus ne prend peut-être pas réellement au moment de l'exécution. Il y a 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 dans l'exemple suivant: si le processus utilise une certaine bibliothèque, la taille de la bibliothèque contribuera également à la virtual-size. cependant, étant donné que seule une partie de la bibliothèque sera utilisée (c’est-à-dire certaines méthodes utilisées), resident-size.

Référer pour Plus d'informations


2
2018-02-26 14:27





"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.


0
2018-04-18 23:03