Solaris Resource Manager permet à un administrateur de contrôler :
La quantité de mémoire virtuelle détenue par des utilisateurs ou par une application (il s'agit d'une mesure de l'utilisation de mémoire virtuelle de tous les processus au niveau du noeud limite).
La quantité de mémoire virtuelle détenue par un groupe d'utilisateurs ou par une application (il s'agit d'une mesure de l'utilisation de mémoire virtuelle de tous les processus reliés au chef de groupe ou à ses enfants, effectuée au niveau du noeud limite du chef de groupe).
La quantité de mémoire virtuelle détenue par un processus.
Le nombre de processus pouvant être exécutés simultanément par un utilisateur/noeud limite.
Les attributs système qui sont utilisés pour enregistrer l'utilisation de mémoire virtuelle et lui assigner des limites sont :
L'attribut memory.myusage d'un noeud limite est égal à la somme de l'utilisation de la mémoire virtuelle de tous les processus actuellement reliés à ce noeud.
L'attribut memory.usage d'un noeud limite est égal à la somme de son attribut memory.myusage et des attributs memory.usage de ses noeuds enfants.
L'attribut memory.limit est appliqué à l'attribut memory.usage. Il limite l'utilisation conjointe de la mémoire par tous les processus reliés au noeud limite et aux noeuds membres.
L'attribut système qui est utilisé pour enregistrer l'utilisation des processus et d'y assigner des limites est :
L'attribut memory.plimit d'un noeud limite est une limite par processus appliquée séparément à l'utilisation de mémoire de chaque processus qui est relié à ce noeud ou à ses membres.
Chaque fois qu'un processus tente d'accroître sa taille de mémoire, il est assujetti aux limites de mémoire (totale et par processus) du noeud limite auquel il est relié. Un processus dispose de cinq méthodes pour tenter d'accroître sa taille de mémoire :
Appel d'une routine d'attribution telle que malloc(3C), qui lance un appel système sbrk(2). Si une limite de mémoire est dépassée, l'appel renvoie une erreur portant le code ENOMEM.
Expansion d'une pile provoquant une défaillance de pile, ce qui cause normalement le transfert d'une page de mémoire additionnelle au processus. Si une limite de mémoire est dépassée, un signal SIGSEGV est envoyé au processus.
Utilisation de mmap( 2).
Utilisation de fork( 2). L'espace adresse enfant est dupliqué tout en demeurant la propriété du processus père. Lors de la duplication, le nouvel espace d'adressage ne dépassera pas memory.plimit puisque le père doit déjà se trouver dans cette limite.Cependant, l'attribution est tributaire de memory.plimit.
Utilisation de exec( 2). Lors d'une commande exec, l'utilisation mémoire décroît lorsque l'ancien espace adresse est supprimé. Cependant, si l'espace d'adressage du nouveau programme est supérieur et entraîne le dépassement de la limite, exec peut échouer.
La fonction de reconfiguration dynamique (RD) des systèmes Enterprise 10000, Sun Fire 15K et Sun Fire 12K a peu d'effets sur les limites de mémoire virtuelle imposées aux noeuds limites. Plus précisément, la RD permet d'ajouter ou de supprimer de la mémoire physique du système pendant son fonctionnement (le pool de mémoire virtuelle du système comprend toute la mémoire physique et l'espace d'échange configuré dans le système). De plus, la commande swap(1M) peut être exécutée sur tout système Solaris pour ajouter (- a) ou supprimer (-d) de l'espace d'échange sur le système. De cette façon, la mémoire virtuelle totale peut augmenter et diminuer pendant le fonctionnement du système.
Cette procédure a un effet indirect sur les limites de mémoire virtuelle imposées par Solaris Resource Manager. La mémoire virtuelle étant gérée en unités absolues (plutôt que par parts), les limites effectives ne changent pas lorsque les ressources du système sont modifiées pendant son fonctionnement (notez que cet effet est différent de celui de la reconfiguration dynamique des processeurs, décrite à la rubrique Reconfiguration dynamique).
Les attributs système utilisés pour gérer l'utilisation des processus (nombre de processus) sont les suivants :
L'attribut process.myusage d'un noeud limite est égal au nombre de processus reliés à ce noeud.
L'attribut process.usage d'un noeud limite est égal à la somme de son attribut process.myusage et des attributs process.usage de ses noeuds enfants.
L'attribut process.limit est une limite appliquée à l'attribut process.usage d'un noeud limite, afin de limiter le nombre de processus pouvant être reliés simultanément à ce noeud et à tous les noeuds membres.
Les appels système fork(2) et vfork( 2) sont utilisés pour créer de nouveaux processus. Si la limite de processus était dépassée, l'appel système échouerait et renverrait une erreur EAGAIN. La plupart des programmes interprètent EAGAIN comme un manque temporaire de ressources système et réexécutent fork après une courte pause. Si l'échec de fork est causé par une limite de Solaris Resource Manager, cela peut générer une boucle qui sera exécutée indéfiniment du fait que EAGAIN sera renvoyé à chaque tentative jusqu'à ce que la limite fixée pour le noeud concerné soit atteinte.