J'ai donc 4 Go de RAM + 4 Go swap. Je souhaite créer un utilisateur avec une mémoire RAM et un échange limités: 3 Go de RAM et 1 Go d’échange. Une telle chose est-elle possible? Est-il possible de démarrer des applications avec une mémoire RAM et un échange limités qui leur sont disponibles sans créer un utilisateur distinct (et sans installer d'applications spéciales - n'ayant qu'une configuration de serveur Debian / CentOS par défaut et n'utilisant pas sudo)?
Mise à jour:
J'ai donc ouvert terminall et tapé dedans la commande ulimit : ulimit -v 1000000
ce sera comme 976,6Mb
limitation. Ensuite, j'ai appelé ulimit -a
et vu que la limitation est "activée". Ensuite, j'ai commencé un script bash qui compile et démarre mon application nohup
, un long nohup ./cloud-updater-linux.sh >& /dev/null &
... mais après un certain temps, j'ai vu:
(Ce qui serait bien si aucune limitation n'était appliquée - il a téléchargé une bibliothèque volumineuse et a commencé à la compiler.)
Mais je pensais avoir appliqué des limitations au shell et à tous les processus lancés avec / depuis celui-ci ulimit -v 1000000
? Qu'est-ce que je me suis trompé? Comment faire en sorte qu'un terminal et tous les sous-processus qu'il lance soient limités à l'utilisation de RAM?
la source
Réponses:
ulimit
est fait pour cela. Vous pouvez configurer les valeurs par défaut pourulimit
chaque utilisateur ou groupe de personnes dansulimit -v KBYTES
définit la taille maximale de la mémoire virtuelle. Je ne pense pas que vous puissiez donner un maximum d’échange. C'est juste une limite sur la quantité de mémoire virtuelle que l'utilisateur peut utiliser.Donc, vous
limits.conf
auriez la ligne (avec un maximum4G
de mémoire)MISE À JOUR - CGroupes
Les limites imposées par
ulimit
etlimits.conf
sont par processus. Je n'étais certainement pas clair sur ce point.Si vous souhaitez limiter la quantité totale de mémoire utilisée par un utilisateur (ce que vous avez demandé). Vous voulez utiliser les cgroups .
Dans
/etc/cgconfig.conf
:Cela crée une
cgroup
limite de mémoire maximale de 4 Go.Dans
/etc/cgrules.conf
:Ainsi, tous les processus exécutés par
luser
s'exécuteront dans lesmemlimit
groupes de contrôle créés danscgconfig.conf
.la source
useradd
?Vous ne pouvez pas limiter l'utilisation de la mémoire au niveau utilisateur; ulimit peut le faire, mais pour un processus unique.
Même en utilisant des limites par utilisateur
/etc/security/limits.conf
, un utilisateur peut utiliser toute la mémoire en exécutant plusieurs processus.Si vous souhaitez vraiment limiter les ressources, vous devez utiliser un outil de gestion des ressources, tel que rcapd utilisé par les projets et les zones sous Solaris.
Il y a quelque chose qui semble fournir des fonctionnalités similaires sur Linux que vous pourriez explorer: les groupes de contrôle .
la source
cgroups
sont la bonne façon de le faire, comme d'autres réponses l'ont souligné. Malheureusement, il n’ya pas de solution parfaite au problème, comme nous le verrons plus loin. Il existe différentes manières de définir les limites d'utilisation de la mémoire du groupe de contrôle. Comment faire pour que la session de connexion d'un utilisateur fasse automatiquement partie d'un groupe de contrôle varie d'un système à l'autre. Red Hat a quelques outils, tout comme systemd .memory.memsw.limit_in_bytes
etmemory.limit_in_bytes
fixer des limites incluant et non compris l'échange, respectivement. L'inconvénientmemory.limit_in_bytes
est qu'il compte les fichiers mis en cache par le noyau pour le compte des processus du groupe de contrôle par rapport au quota du groupe. Moins de cache signifie plus d’accès au disque. Vous risquez donc de perdre des performances si le système disposait d’une mémoire suffisante.D'autre part,
memory.soft_limit_in_bytes
permet au groupe de contrôle de dépasser le quota, mais si le tueur de MOO du noyau est invoqué, les groupes de contrôle dépassant leurs quotas sont tués en premier, logiquement. L’inconvénient, c’est qu’il existe parfois des situations dans lesquelles de la mémoire est nécessaire immédiatement et que le tueur OOM n'a pas le temps de rechercher les processus à tuer, auquel cas quelque chose peut échouer avant les processus de l’utilisateur hors quota. tué.ulimit
, cependant, est absolument le mauvais outil pour cela. ulimit impose des limites à l'utilisation de la mémoire virtuelle, ce qui n'est certainement pas ce que vous voulez. De nombreuses applications réelles utilisent beaucoup plus de mémoire virtuelle que de mémoire physique. La plupart des runtime collectés (Java, Go) fonctionnent de cette manière pour éviter la fragmentation. Un programme trivial "hello world" en C, s'il est compilé avec un assainisseur d'adresses, peut utiliser 20 To de mémoire virtuelle. Allocateurs qui ne s'appuient pas sursbrk
, comme jemalloc (qui est l'allocateur par défaut pour Rust) ou tcmalloc, aura également une utilisation de la mémoire virtuelle largement supérieure à leur utilisation physique. Pour plus d'efficacité, de nombreux outils utilisent des fichiers mmap, ce qui augmente l'utilisation virtuelle mais pas nécessairement physique. Tous mes processus Chrome utilisent 2 To de mémoire virtuelle chacun. Je suis sur un ordinateur portable avec 8 Go de mémoire physique. Quiconque tenterait de définir des quotas de mémoire virtuelle risquait de casser Chrome, de le forcer à désactiver certaines fonctionnalités de sécurité reposant sur l'allocation (mais de ne pas utiliser) de grandes quantités de mémoire virtuelle, ou d'empêcher complètement un utilisateur d'abuser du système. .la source