Comment définir des ulimits pour un service commençant au démarrage?

18

J'ai besoin, pour que mysql utilise de grandes pages, de définir un ulimit - je l'ai fait dans limits.conf. Cependant, limits.conf (pam_limits.so), n'est pas lu pour init, seulement pour les "vrais" shells. J'ai résolu ce problème auparavant en ajoutant un "ulimit -l" à la fonction de démarrage initscript. J'ai besoin d'une sorte de méthode reproductible pour le faire, maintenant que les boîtes sont gérées avec chef, et nous ne voulons pas reprendre un fichier qui appartient réellement au RPM.

jayofdoom
la source
Veuillez regarder pour voir si vous rencontrez le même bug. serverfault.com/questions/415570/…
Minto Joseph

Réponses:

8
$ echo "* hard nofile 102400" >> /etc/security/limits.conf
$ echo "* soft nofile 102400" >> /etc/security/limits.conf
$ sysctl -w fs.file-max=102400
$ sysctl -p

Les 4 étapes peuvent changer les limites de votre système immédiatement et peuvent toujours fonctionner après votre redémarrage. Vous pouvez changer le nombre "102400" en nombre de fichiers ouverts max dans votre système Linux comme vous le souhaitez. et

$ sysctl -p

à charger dans les paramètres sysctl à partir du fichier spécifié ou /etc/sysctl.conf si aucun n'est fourni.

Sofring
la source
2
limits.conf n'est pas lu par inittab car limit.so n'est pas lu pour lui. Vous pourriez être en mesure de pirater PAM, mais je ne peux pas savoir quel fichier il pourrait lire.
Xarses
Notez que le caractère générique *ne fonctionne pas pour l' rootutilisateur, vous devrez spécifier rootexplicitement ...
Matt
@Xarses a raison. limit.conf ne sera pas appliqué pour certains démons à partir du démarrage. Je ne pense pas que cela réponde à la question.
Alchemist
2

/etc/sysctl.conf devrait pouvoir définir les éléments ulimits. Je n'ai pas été en mesure de tester cela correctement, mais l'enquête indique que vous devriez pouvoir vous arrêter une fois qu'il est défini dans sysctl.conf.

J'ai trouvé divers sujets qui montrent que c'est toujours un problème et mon équipe et moi avons discuté de certaines options autour de cela, nous avons trouvé deux solutions de contournement potentielles.

Option 1: La plupart des sources de rhel initscripts /etc/init.d/functions, vous pouvez y modifier les paramètres ulimit

Option 2: init affirme que / etc / initscript provient à chaque fois avant que init n'apparaisse, voir: http://linux.die.net/man/5/initscript . Assez intéressant, ils disent que c'est là que les gens peuvent définir ulimit =)

Xarses
la source
1

Extrait de recette autonome basé sur cette URL:

http://pro.benjaminste.in/post/318453669/increase-the-number-of-file-descriptors-on-centos-

Extrait de recette:

ruby_block "edit /etc/sysctl.conf" do
  _file = "/etc/sysctl.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "fs.file-max = 512000"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
  notifies :run, "execute[sysctl -p]", :immediately
end

execute "sysctl -p" do
  command "sysctl -p"
  returns 255 # which would normally signify error, but doesn't on sysctl on CentOS
  action :nothing
end

ruby_block "edit /etc/security/limits.conf" do
  _file = "/etc/security/limits.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "* - nofile 65535"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
end
Joe Goggins
la source
0

Ma solution consistait simplement à faire cela dans notre recette de chef:

# Ensure ulimits are properly set for the initscript
bash "Set Ulimits" do
    user "root"
    code <<-EOH
    echo -e "n#Setting ulimits. Performed by chef recipe MYSQLULIMIT\nulimit -l" >> /etc/sysconfig/init
    EOH
    not_if "grep MYSQLULIMIT /etc/sysconfig/init"
end

Cela provoque la ulimit -lmise en place de tous les scripts d'initialisation, ce qui peut être indésirable dans certains environnements, mais convient au mien.

Dans un monde parfait, j'obtiendrais le RPM mis à jour pour inclure a /etc/sysconfig/mysqld, et y mettrais la même commande ulimit -l.

jayofdoom
la source
0

Je ne sais pas à quel point c'est spécifique à la distribution, mais je viens d'intégrer une augmentation de la limite de sécurité en utilisant /etc/security/limits.d/20-somefile.confdans Ubuntu.

Plutôt que d'avoir à modifier un fichier existant, j'ai un modèle ERB dans mon livre de recettes, définissez les attributs par défaut dans un fichier d'attributs et n'avez pas à vous soucier de l'utilisation de blocs rubis avec des éléments "insert_line_if_no_match" - cela semble un peu plus complexe et la recette est un peu plus lisible comme ceci:

execute "activate_sysctl" do
  user "root"
  command "sysctl -p /etc/sysctl.d/10-filemax.conf"
  action :nothing
end

template "/etc/sysctl.d/10-filemax.conf" do
  source "system/filemax.conf"
  action :create
  notifies :run, "execute[activate_sysctl]", :immediately
end

et voici mon fichier modèle:

fs.filemax = <%= node[:mycookbook][:system_fs_filemax] %>
Brett
la source
0

selon la page de manuel ulimit est obsolète. Vous devez utiliser setrlimit. Le problème est qu'il s'agit d'un appel système au lieu d'une commande bash.

J'ai eu ce problème avec le superviseur et c'est ce que j'ai découvert. Si le processus n'a pas de fichier de configuration qui vous permet d'appeler l'appel système setrlimit (). Définissez-le avec ulimit sur son script bash /etc/init.d. C'est le script de service qui démarre votre processus.

Si le processus a un fichier de configuration, comme le superviseur d, vous pouvez utiliser ce fichier de configuration pour définir le nombre de fichiers et demander au processus d'appeler directement setrlimits ().

Superviseur: http://supervisord.org/configuration.html#supervisord-section-settings

TomcaT: http://www.jayway.com/2012/02/11/how-to-really-fix-the-too-many-open-files-problem-for-tomcat-in-ubuntu/

einarc
la source
0

La méthode RedHat, comme décrit dans l' article 253043 (abonnement requis), consiste à ajouter des instructions ulimit appropriées à /etc/sysconfig/<service name>. Par exemple:

# echo "ulimit -SHn 10240   # nfile" >> /etc/sysconfig/myServiceName

(Utilisez le fichier existant pour votre service au lieu de myServiceName.)

Pour les démons qui démarrent sans utiliser le script RedHat "sysconfig", vous devez ajouter les lignes ulimit appropriées au script de démarrage du démon.

Steve Bonds
la source
-1

Essayez de le configurer dans le fichier /etc/sysctl.conf

siupakabras
la source
Il y a des éléments de configuration requis pour faire cela qui appartiennent à sysctl.conf, et ceux-ci sont en place - nous avons juste besoin de modifier ulimits pour permettre l'accès à ces pages géantes.
jayofdoom
-1

J'ai en fait écrit un livre de cuisine de chef privé qui est utilisé pour définir ulimit pour nous et cela fonctionne assez bien. Pour ubuntu, nous avons constaté que l'astuce suivante est requise si vous souhaitez un paramètre ulimit global:

Ajoutez les éléments suivants à votre session commune:

session required        pam_limits.so

et dans limit.conf, vous devez disposer des éléments suivants:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

La partie racine est importante car il semble sans que certains scripts d'initialisation ne fonctionneront pas correctement. Nous avons donc un livre de cuisine de chef qui configure les éléments suivants et cela fonctionne très bien.

Une autre option que nous avions l'habitude d'utiliser pour Tomcat était de déployer Tomcat, puis d'écraser le script init avec une coutume pour laquelle nous définirions ulimit et redémarrer tomcat. Cela fonctionne très bien mais est un peu plus hacky que le premier.

J'espère que cette aide, et peut-être un jour je pourrai ouvrir le livre de cuisine que nous avons en interne, car c'est assez simple mais pourrait être utile à d'autres comme vous.

Zuhaib
la source
Cela ne résoudra pas le problème de l'affiche. Pam n'est invoquée que lorsqu'un utilisateur ouvre une session (shell). Étant donné que le système init est démarré indépendamment des sessions utilisateur, pam ne s'applique pas.
Patrick