En utilisant ps, je peux voir la taille, la vsize (identique au VIRT du haut?) Et le rss (le même que le RES du haut?). (Un autre que je vois en haut est SHR.)
Quelqu'un pourrait-il résumer pour moi ce que ces différents domaines signifient?
En utilisant ps, je peux voir la taille, la vsize (identique au VIRT du haut?) Et le rss (le même que le RES du haut?). (Un autre que je vois en haut est SHR.)
Quelqu'un pourrait-il résumer pour moi ce que ces différents domaines signifient?
Réponses:
En bref:
Taille virtuelle: est la quantité d'espace d'adressage qu'un processus gère. L'espace d'adressage virtuel contient tout ce à quoi le processus peut accéder via des pointeurs (références d'adresse mémoire). Par exemple, si votre programme a accès au framebuffer de votre carte vidéo, cette mémoire est mappée à l'espace virtuel du processus et reçoit une adresse qui est stockée sur un pointeur. Les fichiers mappés en mémoire et les mappages anonymes sont également pris en compte dans la taille de l'espace d'adressage virtuel. Presque tout est dans la taille virtuelle. Si vous résumez la taille de toutes les plages d'adresses répertoriées dans /proc/<pid>/maps
, cela devrait vous renvoyer à peu près la même valeur que la taille virtuelle.
Taille résidente: est la quantité de mémoire qui appartient spécifiquement à ce processus qui réside actuellement en mémoire. Cela signifie, la quantité de mémoire qui n'est pas en swap. Notez que certaines parties du processus peuvent être dans la mémoire d'échange même lorsque le processus est en cours d'exécution. Le système d'exploitation tirera ces régions du swap lorsque le processus tentera d'y accéder. Cela devrait inclure le tas, les piles de tous les threads et autres mappages privés. Si vous regardez /proc/<pid>/maps
, les [stack]
, [heap]
et autres correspondances anonymes (sans les chemins de fichiers) sont soit échangés ou comptabilisés dans la taille résidente.
Taille partagée: est la quantité de mémoire qui peut appartenir à plusieurs processus. Par exemple, si vous avez quatre instances de la même application chargées en mémoire, vous aurez quatre instances du tas et au moins quatre piles, une pour chaque processus (il s'agit de la mémoire résidente), mais vous n'aurez qu'une seule instance de le code binaire du programme et de ses bibliothèques. Ceci est l'espace partagé. Non seulement il inclut le code binaire du programme et ses bibliothèques, mais aussi des fichiers de localisation, des données de programme en lecture seule, des segments de mémoire partagée SysV et POSIX, des sémaphores, etc ... Si vous regardez dans /proc/<pid>/maps
, la plupart des mappages liés aux fichiers de bibliothèque et de programme sont partagé.
Notez que VIRT contient l'union de RSS et SHR et sera toujours supérieur à l'un d'eux. Il peut y avoir des régions à la fois RSS et SHR.
Dans la réponse de Juliano:
Notez que RSS + SHR <= VIRT, toujours.
C'est tout simplement faux. SHR contient toute la mémoire virtuelle qui pourrait être partagée avec d'autres processus et RSS contient physiquement toute la mémoire dans la RAM utilisée par le processus.
Ainsi, toute la mémoire partagée actuellement dans la RAM est comptée à la fois dans SHR et dans RSS, donc SHR + RSS n'a aucune signification car elle peut contenir des doublons.
Pour construire un processus avec RSS + SHR> VIRT, il suffit de mapper un gros fichier (1 Go), puis de le lire complètement: le fichier mmappé sera chargé en RAM, et VIRT, SHR et RSS seront chacun légèrement plus grands que 1 Go, donc SHR + RSS> VIRT.