Controle de ressources - Solaris
En cours de rédaction.
Présentation
Le contrôle de ressource, sous Solaris, permet de limiter ou augmenter les ressources (mémoire, cpu, temps cpu, nombre de fichiers ouverts, et bien d'autres). On peut agir, du plus global au plus fin, au niveau des zones, des projets, des tâches et des processus.
Pour voir tous les paramètres sur lesquels on peut agir, on utilise la commande rctladm :
# rctladm process.max-port-events syslog=off [ deny count ] process.max-msg-messages syslog=off [ deny count ] process.max-msg-qbytes syslog=off [ deny bytes ] process.max-sem-ops syslog=off [ deny count ] process.max-sem-nsems syslog=off [ deny count ] process.max-address-space syslog=off [ lowerable deny no-signal bytes ] process.max-file-descriptor syslog=off [ lowerable deny count ] process.max-core-size syslog=off [ lowerable deny no-signal bytes ] process.max-stack-size syslog=off [ lowerable deny no-signal bytes ] process.max-data-size syslog=off [ lowerable deny no-signal bytes ] process.max-file-size syslog=off [ lowerable deny file-size bytes ] process.max-cpu-time syslog=off [ lowerable no-deny cpu-time inf seconds ] task.max-cpu-time syslog=off [ no-deny cpu-time no-obs inf seconds ] task.max-lwps syslog=off [ count ] project.max-contracts syslog=off [ no-basic deny count ] project.max-device-locked-memory syslog=off [ no-basic deny bytes ] project.max-locked-memory syslog=off [ no-basic deny bytes ] project.max-port-ids syslog=off [ no-basic deny count ] project.max-shm-memory syslog=off [ no-basic deny bytes ] project.max-shm-ids syslog=off [ no-basic deny count ] project.max-msg-ids syslog=off [ no-basic deny count ] project.max-sem-ids syslog=off [ no-basic deny count ] project.max-crypto-memory syslog=off [ no-basic deny bytes ] project.max-tasks syslog=off [ no-basic count ] project.max-lwps syslog=off [ no-basic count ] project.cpu-cap syslog=off [ no-basic deny no-signal inf count ] project.cpu-shares syslog=n/a [ no-basic no-deny no-signal no-syslog count ] zone.max-swap syslog=off [ no-basic deny bytes ] zone.max-locked-memory syslog=off [ no-basic deny bytes ] zone.max-shm-memory syslog=off [ no-basic deny bytes ] zone.max-shm-ids syslog=off [ no-basic deny count ] zone.max-sem-ids syslog=off [ no-basic deny count ] zone.max-msg-ids syslog=off [ no-basic deny count ] zone.max-lwps syslog=off [ no-basic count ] zone.cpu-cap syslog=off [ no-basic deny no-signal inf count ] zone.cpu-shares syslog=n/a [ no-basic no-deny no-signal no-syslog count ]
Les projets
Présentation
La manière la plus souple de gérer les ressources, est d'utiliser les projets. Tout ce qui est modifié dans les projets est pris en compte à chaud. Le fichier de configuration des projets est /etc/projects. Il contient tous les projets du serveur.
Voici un exemple de fichier /etc/project :
root@parvs4114434 data-4# cat /etc/project system:0:::: user.root:1:::: noproject:2:::: default:3:::: group.staff:10:::: user.SrvTelm:100::SrvTelm::process.max-file-descriptor=(priv,1024,deny);project.max-sem-ids=(priv,768,deny);project.max-shm-ids=(priv,2048,deny) user.accesprd:102:AccessProd:accesprd::process.max-cpu-time=(basic,30,signal=TERM),(priv,60,signal=KILL);project.max-lwps=(priv,15,deny)
Ce format n'est pas très lisible, on utilise donc la commande projects -l pour afficher tous les projets de manière plus claire.
root@parvs4114434 data-4# projects -l system projid : 0 comment: "" users : (none) groups : (none) attribs: user.root projid : 1 comment: "" users : (none) groups : (none) attribs: noproject projid : 2 comment: "" users : (none) groups : (none) attribs: default projid : 3 comment: "" users : (none) groups : (none) attribs: group.staff projid : 10 comment: "" users : (none) groups : (none) attribs: user.SrvTelm projid : 100 comment: "" users : SrvTelm groups : (none) attribs: process.max-file-descriptor=(priv,1024,deny) project.max-sem-ids=(priv,768,deny) project.max-shm-ids=(priv,2048,deny) user.accesprd projid : 102 comment: "AccessProd" users : accesprd groups : (none) attribs: process.max-cpu-time=(basic,30,signal=TERM),(priv,60,signal=KILL) project.max-lwps=(priv,15,deny)
Pour ne voir que le nom des projets rattachés à notre process, on tape juste projects.
# projects user.root default
Dans notre cas, on dépend des projets "user.root" et "default". Pour voir les valeurs qu'ils altèrent, on fait comme ceci :
# projects -l user.root default user.root projid : 1 comment: "" users : (none) groups : (none) attribs: default projid : 3 comment: "" users : (none) groups : (none) attribs:
Et pour voir toutes les valeurs actuellement affectées à notre process (et donc également la liste des valeurs modifiables), on tape prctl $$. La sortie est longue. Exemple :
# prctl $$ process: 4506: bash NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT process.max-port-events privileged 65.5K - deny - system 2.15G max deny - process.max-msg-messages privileged 8.19K - deny - system 4.29G max deny - process.max-msg-qbytes privileged 64.0KB - deny - system 16.0EB max deny - process.max-sem-ops privileged 512 - deny - system 2.15G max deny - process.max-sem-nsems privileged 512 - deny - system 32.8K max deny - process.max-address-space privileged 16.0EB max deny - system 16.0EB max deny - process.max-file-descriptor basic 256 - deny 4506 privileged 65.5K - deny - system 2.15G max deny - process.max-core-size privileged 8.00EB max deny - system 8.00EB max deny - process.max-stack-size basic 8.00MB - deny 4506 privileged 8.00EB - deny - system 8.00EB max deny - process.max-data-size privileged 16.0EB max deny - system 16.0EB max deny - process.max-file-size privileged 8.00EB max deny,signal=XFSZ - system 8.00EB max deny - process.max-cpu-time privileged 18.4Es inf signal=XCPU - system 18.4Es inf none - task.max-cpu-time system 18.4Es inf none - task.max-lwps system 2.15G max deny - project.max-contracts privileged 10.0K - deny - system 2.15G max deny - project.max-device-locked-memory privileged 3.91GB - deny - system 16.0EB max deny - project.max-locked-memory system 16.0EB max deny - project.max-port-ids privileged 8.19K - deny - system 65.5K max deny - project.max-shm-memory privileged 15.6GB - deny - system 16.0EB max deny - project.max-shm-ids privileged 128 - deny - system 16.8M max deny - project.max-msg-ids privileged 128 - deny - system 16.8M max deny - project.max-sem-ids privileged 1.02K - deny - system 16.8M max deny - project.max-crypto-memory privileged 15.6GB - deny - system 16.0EB max deny - project.max-tasks system 2.15G max deny - project.max-lwps system 2.15G max deny - project.cpu-cap system 4.29G inf deny - project.cpu-shares privileged 1 - none - system 65.5K max none - zone.max-swap privileged 20.0GB - deny - system 16.0EB max deny - zone.max-locked-memory system 16.0EB max deny - zone.max-shm-memory system 16.0EB max deny - zone.max-shm-ids system 16.8M max deny - zone.max-sem-ids system 16.8M max deny - zone.max-msg-ids system 16.8M max deny - zone.max-lwps system 2.15G max deny - zone.cpu-cap privileged 1.50K - deny - system 4.29G inf deny - zone.cpu-shares privileged 1 - none - system 65.5K max none -
Certaines valeurs se comprennent facilement, d'autres beaucoup moins. Chaque valeur commence par un mot suivit d'un point et du reste. Le mot du début ne peut avoir que quatre valeurs : process, task, project et zone. Ce sont les quatre groupes de ressources sur lesquelles ont peut agir. Les valeurs "zone.cpu*" sont détaillées dans le chapitre sur les zones.
Création / Modification de projet
Sur un serveur Solaris fraîchement installé, on a déjà plusieurs projets de créés. Si on utilise la commande projects -l pour voir la liste des projets créés, on remarque qu'il y a différents niveaux d'action, plus ou moins prioritaires. Reprenons notre exemple, en n'affichant que le nom des projets :
- projects -l |grep "^[A-Za-z0-9]"
system user.root noproject default group.staff user.SrvTelm user.accesprd
On voit donc qu'on a un projet "system" qui s'applique à tout le système. Ensuite, on a des projets qui commencent par "user.". Ces projets vont s'appliquer uniquement au compte associé, par exemple au compte root pour le projet user.root. Les projets qui commencent par "group." vont s'appliquer à tous les membres du groupe.
[TO DO] : noproject et default.
Pour créer un nouveau projet, on utilise la commande projadd. Pour modifier un groupe existant, on utilise projmod.
Exemple concret, limitation des ressources d'un compte utilisateur
Ci-dessous, nous allons créer un projet qui va limiter le temps cpu du compte accesprd. Nous voulons que les process lancés par ce compte soient tués à partir de 30 secondes de temps cpu. Et s'ils ne s'arrêtent pas avec un simple SIGTERM (kill), on lance un SIGKILL (kill -9) au bout de 60 secondes. Voici la syntaxe :
# projadd -U accesprd -c "AccessProd" -K "process.max-cpu-time=(basic,30,signal=TERM),(priv,60,signal=KILL)" user.accesprd
Celà créé le projet "user.accesprd" (dernier argument), qui s'applique au compte accesprd (-U accesprd) avec les valeurs passées par le paramètre -K. Les syntaxe des paramètres passés dans le -K varient suivant le paramètre lui-même ; voir les pages man ou google pour chaque paramètre. L'option du "-c" sert à mettre un commentaire.
La variable s'appelant process.max-cpu-time, on voit qu'elle agit au niveau des process, donc c'est chaque process qui est limité, pas la somme des process de accesprd.
Maintenant, nous voulons limiter encore plus le compte accesprd on le limitant à 15 processus (ou thread) en tout sur le serveur. La projet existant, on utilisera projmod.
# projmod -s -K "project.max-lwps=(priv,15,deny)" user.accesprd
La syntaxe est très proche de projadd. Le "-s" est ici facultatif ; il permet de mettre à jour la valeur, si elle existe déjà.
La variable s'appelant project.max-lwps, elle agit au niveau du projet, donc c'est global sur le serveur.
Exemple 2 : limiter le max file descriptor
Cet exemple est un grand classique pour le compte oracle sur Solaris 10. En effet, la valeur système par défaut de cette variable est de 256 sur Solaris 10, ce qui n'est pas suffisant pour Oracle. On va l'augmenter à 4096.
Cette valeur s'appelle process.max-file-descriptor dans prctl. Elle correspond à la valeur open files pour ulimit (commande "ulimit -n").
projadd -U oracle -K "process.max-file-descriptor=(privileged,4096,deny)" user.oracle