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.
$ 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é.
/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 =)
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
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.
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.
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] %>
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