web-dev-qa-db-fra.com

Comment définir des ulimits pour un service à partir du démarrage?

J'ai besoin, pour que MySQL utilise de grandes pages, pour définir un ulimit - j'ai fait cela dans des limites.conf. Cependant, LIMITS.CONF (PAM_LIMITS.SO), n'est pas lu pour INIT, uniquement pour les coquilles "réelles". J'ai déjà résolu cela avant d'ajouter un "ulimit -l" à la fonction de démarrage initscript. J'ai besoin d'une manière répétable de le faire, maintenant que les cases sont gérées avec le chef et nous ne voulons pas prendre en charge un fichier qui est en fait appartenant à la RPM.

18
jayofdoom
$ 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 modifier immédiatement les limites de votre système et peuvent toujours fonctionner après votre redémarrage. Vous pouvez modifier le numéro "102400" au numéro de fichier open-open Max dans votre système Linux comme vous le souhaitez. et

$ sysctl -p

pour charger dans les paramètres SYSCTL dans le fichier spécifié ou /etc/sysctl.conf si aucun n'est donné.

7
Sofring

/etc/sysctl.conf doit être en mesure de définir les éléments ULIMITS. Je n'ai pas été en mesure de tester ce puits mais l'enquête indique que vous devriez pouvoir vous arrêter après sa définition dans SYSCTL.CONF.

J'ai trouvé divers sujets qui montrent que c'est encore un problème et mon équipe et j'ai discuté de certaines options à ce sujet, nous avons trouvé deux solutions de contournement potentielles.

Option 1: la plupart Rhel initscripts source /etc/init.d/functions, vous pouvez modifier les paramètres ulimit

Option 2: Init affirme que/etc/initscript est source d'origine à chaque fois avant que Init Spawns tout ce qui se trouve: http://linux.die.net/man/5/inditscript . Il est intéressant de noter assez, ils disent que c'est où les gens peuvent définir Ulimit =)

2
Xarses

Snippet de recette autonome basé sur cette URL:

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

Snippet 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
1
Joe Goggins

La voie de Redhat, comme décrit dans article 25304 (souscription requise) consiste à ajouter des déclarations d'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 commencent sans utiliser le script RedHat "SysConfig", vous devez ajouter les lignes ULIMIT appropriées au script de démarrage du démon.

1
Steve Bonds

Ma solution faisait simplement 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 le ulimit -l Pour être défini pour tous les initscripts, ce qui peut être indésirable dans certains environnements, mais convient à la mienne.

Dans un monde parfait, je recevrais le RPM mis à jour pour inclure un /etc/sysconfig/mysqld, et mettre la même commande Ulimit -L là-bas.

1
jayofdoom

Pas sûr de la manière dont cela est spécifique de la distribution, mais je viens de incorporer une augmentation de la limite de sécurité en utilisant /etc/security/limits.d/20-somefile.conf à 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, puis n'a pas à vous soucier d'utiliser Ruby blocks avec "insertion_line_if_no_match". Stuff - 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 alors c'est mon fichier de modèle:

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

selon une page d'homme, Ulimit est obsolète. Vous devez utiliser SETRLIMIMIT. Le problème est que c'est 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 de passer un appel à SETRLIMIT () appel système. Définissez-le avec Ulimit sur son script /etc/init.d bash. C'est le script de service qui commence votre processus.

Si le processus a un fichier de configuration, comme superviseur D, vous pouvez ensuite utiliser ce fichier de configuration pour définir le nombre de fichiers et faire passer l'appel directement sur SETRLIMITS ().

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

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

0
einarc