Controle de ressources - Solaris

De UnixManiax
Aller à la navigation Aller à la recherche


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 :

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