Modifier ulimit (fichiers ouverts) d'un processus spécifique

27

Est-il possible de changer la limite douce et dure d'un processus spécifique ?

Dans mon cas, mon processus est mongodet 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?
tester
la source
Avez-vous lu cette précieuse information? docs.mongodb.org/manual/reference/ulimit
Tink
Oui, j'ai tout appris par cœur .. Je ne sais pas si je manque quelque chose, mais cette page vous indique uniquement comment afficher les détails. Il vous dit seulement d'écrire ulimit -n <valeur> ...
testez

Réponses:

29

Un processus peut modifier ses limites via l' setrlimit(2)appel système. Lorsque vous exécutez, ulimit -nvous 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. La ulimitcommande 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 64vous 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 de setrlimit()manière appropriée.

Pour modifier la mongodb'slimite de descripteur de fichier ouvert, vous devez exécuter ulimit -n 2048(ou tout autre nombre important autorisé par votre noyau) dans un shell. Vous utiliseriez ensuite ce shell pour commencer mongodb. En tant que processus enfant, mongodbhé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.confet exécuter sysctl -p. Regardez la valeur du fs.file-maxparamètre dans /etc/sysctl.conf.

Bruce Ediger
la source
Quelle belle explication! Merci beaucoup. Je vais essayer ça tout de suite!
test
Cette réponse m'a beaucoup aidé, mais le problème est maintenant que la limite stricte est 2048, et ce n'est pas suffisant dans mon cas. 1) Comment puis-je trouver la limite autorisée par mon noyau? 2) Est-il possible de modifier la LIMITE DUR maintenant? Merci encore!
test
@test - Je n'ai jamais relevé la limite stricte. Trouvé ceci: blog.samat.org/2011/04/05/… et ce wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Ils disent la même chose.
Bruce Ediger
18

Pour modifier les limites d'un processus en cours d'exécution, vous pouvez utiliser la commande utilitaire prlimit.

prlimit --pid 12345 --nofile=1024:1024

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/

user7610
la source
Cela m'a sauvé la journée, merci. J'avais un long processus Python qui produisait des too many files openerreurs. Votre réponse a résolu mon problème sans arrêter le processus.
Visionscaper
1

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:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

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.

Todd Lyons
la source
La meilleure solution et la plus pratique.
nelaaro
0

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?

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.

user7610
la source