Est-il possible de changer la limite douce et dure d'un processus spécifique ?
Dans mon cas, mon processus est mongod
et beaucoup de ressources Web me disent d'exécuter simplement:
ulimit -n <my new value>
Mes pensées actuelles:
- Comment la commande connaîtra-t-elle la limite du processus que je vais modifier? Cela ne modifiera-t-il pas la limite de fichiers ouverts de l'ensemble du système?
- Je suppose que cette commande ne fait que modifier la limite souple. Y a-t-il donc un moyen d'augmenter la limite stricte aussi?
Réponses:
Un processus peut modifier ses limites via l'
setrlimit(2)
appel système. Lorsque vous exécutez,ulimit -n
vous devriez voir un nombre. C'est la limite actuelle du nombre de descripteurs de fichiers ouverts (qui inclut les fichiers, les sockets, les canaux, etc.) pour le processus. Laulimit
commande a exécuté l'getrlimit(2)
appel système pour connaître la valeur actuelle.Voici le point clé: un processus hérite de sa limite actuelle de son processus parent. Donc, si vous exécutez,
ulimit -n 64
vous définissez la limite de ce shell de descripteurs de fichiers ouverts à 64. Tout processus démarré par le shell aura la même limite, à moins que ce nouveau processus n'appelle desetrlimit()
manière appropriée.Pour modifier la
mongodb's
limite de descripteur de fichier ouvert, vous devez exécuterulimit -n 2048
(ou tout autre nombre important autorisé par votre noyau) dans un shell. Vous utiliseriez ensuite ce shell pour commencermongodb
. En tant que processus enfant,mongodb
hériterait de la (grande) limite sur les descripteurs de fichiers ouverts.Pour modifier la limite de fichiers ouverts du système, qui ressemble plus à la somme de la limite de descripteurs de fichiers ouverts de tous les processus, vous devez faire quelque chose comme modifier
/etc/sysctl.conf
et exécutersysctl -p
. Regardez la valeur dufs.file-max
paramètre dans/etc/sysctl.conf
.la source
Pour modifier les limites d'un processus en cours d'exécution, vous pouvez utiliser la commande utilitaire
prlimit
.Ce que cela fait en interne, c'est d'appeler
setrlimit(2)
. La page de manuel de prlimit devrait contenir quelques exemples d'invocation utiles.Source: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/
la source
too many files open
erreurs. Votre réponse a résolu mon problème sans arrêter le processus.Sur Linux au moins, la plupart des distributions semblent utiliser pam pour l'authentification. Un module fourni avec pam est le module des limites . Citant du README pour pam_limits:
The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.
Par conséquent, vous pouvez définir des limites par utilisateur, par groupe et par défaut, dans les deux catégories, les limites strictes (root définit cela et le processus ne peut pas demander plus) et les limites souples. Les limites souples sont généralement inférieures aux limites strictes et l'application peut l'augmenter vers le haut jusqu'à ce qu'elle atteigne la limite fixe.
Dans votre cas, si le processus que vous souhaitez augmenter les limites des exécutions en tant qu'utilisateur normal, vous pouvez augmenter les limites pour cet utilisateur ou ce groupe. À titre d'exemple, j'ai des tâches cron mysql sur certains serveurs qui nécessitent l'ouverture de descripteurs de fichiers supplémentaires, j'ai donc défini ceci:
Il n'y a rien à redémarrer; lorsque vous su à cet utilisateur, vous pouvez immédiatement voir que les nouvelles limites prennent effet.
Une autre chose que vous pouvez faire si vous êtes sur un système dérivé de RedHat typique est de placer l'appel ulimit souhaité dans le script / etc / sysconfig / $ SERVICE. Par exemple, le script init d'Apache est nommé /etc/init.d/httpd, et il source le fichier de configuration / etc / sysconfig / httpd s'il est trouvé. J'ai trouvé plus facile à gérer en faisant cela au lieu de modifier le script init lui-même car les scripts init sont mis à jour lorsque le rpm est mis à niveau, mais les fichiers sysconfig ne sont mis à jour que s'ils ne sont pas modifiés par défaut.
la source
La commande modifiera la limite du processus en cours (votre shell) et de tout processus enfant (tout ce que vous exécuterez à partir du shell par la suite).
Les processus sont organisés dans un arbre. Chaque processus a un parent (qui l'a invoqué). Le processus numéro 1, init, est un processus spécial en ce sens qu'il est son propre parent. Des outils comme htop ou top peuvent vous montrer les processus affichés sous forme d'arbre de parents et d'enfants.
la source