Comment modifier le nombre de fichiers ouverts sous Linux? [fermé]

194

Lors de l'exécution de mon application, j'obtiens parfois une erreur too many files open.

L'exécution de ulimit -arapports indique que la limite est 1024. Comment puis-je augmenter la limite au-dessus de 1024?

Modifier les ulimit -n 2048 résultats dans une erreur d'autorisation.

John Meagher
la source
voir aussi: unix.stackexchange.com/a/8949/231660
Guy Avraham
Je viens de passer en revue cela sur Centos 7 (même sur RHEL) et j'ai fait un article de blog le couvrant parce que j'avais tellement de mal même avec tous ces messages: coding-stream-of-consciousness.com/2018/12/21/… . Souvent, avec les fichiers ouverts, vous devez augmenter nproc qui réside en fait dans plusieurs fichiers de paramètres ... et si vous utilisez systemd / systemctl qui a ses propres paramètres distincts. C'est un peu fou.
John Humphreys - w00te
Si vous utilisez VSCode sur Linux, cette solution de contournement pourrait vous aider: stackoverflow.com/a/55027686/1190948
Juri Sinitson

Réponses:

153

Vous pouvez toujours essayer de faire un ulimit -n 2048. Cela ne fera que réinitialiser la limite de votre shell actuel et le nombre que vous spécifiez ne doit pas dépasser la limite stricte

Chaque système d'exploitation a une configuration de limite fixe différente dans un fichier de configuration. Par exemple, la limite de fichiers ouverts sur Solaris peut être définie au démarrage à partir de / etc / system.

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

Sous OS X, ces mêmes données doivent être définies dans /etc/sysctl.conf.

kern.maxfilesperproc=166384
kern.maxfiles=8192

Sous Linux, ces paramètres se trouvent souvent dans /etc/security/limits.conf.

Il existe deux types de limites:

  • les limites souples sont simplement les limites actuellement appliquées
  • les limites strictes indiquent la valeur maximale qui ne peut pas être dépassée en définissant une limite souple

N'importe quel utilisateur peut définir des limites logicielles tandis que les limites strictes ne peuvent être modifiées que par root. Les limites sont la propriété d'un processus. Ils sont hérités lorsqu'un processus enfant est créé, de sorte que les limites à l'échelle du système doivent être définies lors de l'initialisation du système dans les scripts d'initialisation et les limites utilisateur doivent être définies lors de la connexion utilisateur, par exemple en utilisant pam_limits.

Des paramètres par défaut sont souvent définis lors du démarrage de la machine. Ainsi, même si vous pouvez réinitialiser votre ulimit dans un shell individuel, vous pouvez constater qu'il revient à la valeur précédente au redémarrage. Vous pouvez vouloir grep vos scripts de démarrage pour les commandes d'existence ulimit si vous voulez changer la valeur par défaut.

hoyhoy
la source
4
pouvez-vous me dire comment l'utiliser dans Windows?
Pritam
@hoyhoy je peux le changer comme 2048mais pas 4500pourquoi? voir ceci
alhelal
@GaneshKrishnan quoi ajouter dans les fichiers Linux que vous avez mentionnés?
aviral sanjay
@Pritam Windows n'en a pas ulimit. Vous devez spécifier ce que vous utilisez (par exemple WSL, Cygwin).
Melebius
99

Si vous utilisez Linux et que vous avez obtenu l'erreur d'autorisation, vous devrez augmenter la limite autorisée dans le fichier /etc/limits.confou /etc/security/limits.conf(l'emplacement du fichier dépend de votre distribution Linux spécifique).

Par exemple, pour permettre à quiconque sur la machine d'augmenter son nombre de fichiers ouverts jusqu'à 10000, ajoutez la ligne au limits.conffichier.

* hard nofile 10000

Déconnectez-vous ensuite et reconnectez-vous à votre système et vous devriez pouvoir:

ulimit -n 10000

sans erreur d'autorisation.

Jonathan Stanton
la source
6
REMARQUE: le caractère générique ne s'applique pas à l' rootutilisateur. Vous devez spécifier root hard nofile 10000si vous souhaitez ajuster la rootlimite.
Joshua Pinter
1
@JoshPinter Haha, je viens de passer les 3 dernières heures environ à parcourir chaque tutoriel sur la façon de changer le ulimitet enfin découvert que je suis connecté en tant que root. C'est pourquoi j'ai continué à voir le 1024 po ulimit -a. J'ai changé le wildcare et ajouté un *intérieur limits.conf. Tout va bien maintenant (je n'utilise pas les touches ssh, ne vous inquiétez pas: P) - Merci !!!
NiCk Newman
1
@NiCkNewman Je suis content que vous en riiez! C'est une bonne caractéristique chez un programmeur / sysops. J'ai fait la même chose et je n'étais pas si jovial. Heureux que cela ait aidé! :)
Joshua Pinter
SUPPLEMENT: Vous pouvez également trouver une config dans ce répertoire: /etc/security/limits.d/.
Waldemar Wosiński
2
J'ai ouvert /etc/security/limits.conf pour la première fois et j'ai remarqué que tout était commenté. Quelle est alors la valeur par défaut de "hard nofile"?
ka3ak
36

1) Ajoutez la ligne suivante à /etc/security/limits.conf

webuser hard nofile 64000

puis connectez-vous en tant qu'utilisateur Web

su - webuser

2) Modifier les deux fichiers suivants pour l'utilisateur Web

ajoutez les fichiers .bashrc et .bash_profile en exécutant

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) Déconnectez-vous, puis reconnectez-vous et vérifiez que les modifications ont été effectuées correctement:

$ ulimit -a | grep open
open files                      (-n) 64000

C'est tout et eux boom, boom boom.

Vikrant Telkar
la source
9
Si vous changez votre ligne dans limits.conf de «dur» à «doux», cela devrait devenir la nouvelle valeur par défaut et ne pas nécessiter de modification des profils bash.
RishiD
Il semble que vous répétiez des étapes supplémentaires. La définition de limites seules fera la même chose que le profil, mais pour toutes les sessions.
Eddie
6

Si certains de vos services rechignent en ulimits, il est parfois plus facile de mettre des commandes appropriées dans le script init du service. Par exemple, lorsque Apache signale

[alerte] (11) Ressource temporairement indisponible: apr_thread_create: impossible de créer un thread de travail

Essayez de mettre ulimit -s unlimiteden /etc/init.d/httpd. Cela ne nécessite pas de redémarrage du serveur.

Administrateur système
la source