¿Cómo establecer ulimits para un servicio que comienza en el arranque?

18

Necesito, para que mysql use páginas grandes, establecer un ulimit. Lo he hecho en limits.conf. Sin embargo, limit.conf (pam_limits.so) no se lee para init, solo para shells "reales". Resolví esto antes agregando un "ulimit -l" a la función de inicio initscript. Necesito algún tipo de forma repetible para hacer esto, ahora que las cajas se administran con el chef, y no queremos tomar el control de un archivo que en realidad es propiedad del RPM.

jayofdoom
fuente
Eche un vistazo para ver si está encontrando el mismo error. serverfault.com/questions/415570/…
Minto Joseph

Respuestas:

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

Los 4 pasos pueden cambiar los límites de su sistema de inmediato, y aún pueden funcionar después de reiniciar. Puede cambiar el número "102400" por el número máximo de archivos abiertos en su sistema Linux como desee. y

$ sysctl -p

cargar en la configuración de sysctl desde el archivo especificado o /etc/sysctl.conf si no se proporciona ninguno.

Sofring
fuente
2
limit.conf no es leído por inittab porque limit.so no es leído para ello. Es posible que pueda hackear PAM, pero no puedo averiguar qué archivo podría leer.
Xarses
Tenga en cuenta que el comodín *no funciona para el rootusuario, tendrá que especificar rootexplícitamente ...
Matt
@Xarses tiene razón. limit.conf no se aplicará para algunos demonios que comiencen en el momento del arranque. No creo que esto responda la pregunta.
Alquimista
2

/etc/sysctl.conf debería poder establecer los elementos ulimits. No he podido probar esto bien, pero la encuesta dice que deberías poder parar después de configurarlo en sysctl.conf.

Sin embargo, he encontrado varios temas que muestran que todavía es un problema y mi equipo y yo hemos discutido algunas opciones al respecto, hemos encontrado dos posibles soluciones.

Opción 1: la mayoría de las fuentes de rhel initscripts /etc/init.d/functions, puede cambiar la configuración de ulimit allí

Opción 2: init afirma que / etc / initscript se obtiene cada vez que init genera lo que sea, vea: http://linux.die.net/man/5/initscript . Curiosamente, dicen que es donde la gente puede establecer ulimit =)

Xarses
fuente
1

Fragmento de receta autónomo basado en esta url:

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

Fragmento de receta:

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
fuente
0

Mi solución fue simplemente hacer esto en nuestra receta 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

Esto hace ulimit -lque se configure para todos los initscripts, lo que puede ser indeseable en algunos entornos, pero está bien para el mío.

En un mundo perfecto, obtendría el RPM actualizado para incluir a /etc/sysconfig/mysqld, y pondría el mismo comando ulimit -l allí.

jayofdoom
fuente
0

No estoy seguro de cuán específico de la distribución es esto, pero acabo de incorporar un aumento del límite de seguridad al usar /etc/security/limits.d/20-somefile.confUbuntu.

En lugar de tener que modificar un archivo existente, tengo una plantilla ERB en mi libro de cocina, establezco atributos predeterminados en un archivo de atributos y luego no tengo que preocuparme por usar bloques de rubí con cosas "insert_line_if_no_match", que parece un poco más complejo y complejo la receta es un poco más legible como esta:

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

y luego este es mi archivo de plantilla:

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

según la página de manual, ulimit está en desuso. Necesitas usar setrlimit. El problema es que es una llamada al sistema en lugar de un comando bash.

Tuve este problema con el supervisor y esto es lo que descubrí. Si el proceso no tiene un archivo de configuración que le permita hacer una llamada a la llamada del sistema setrlimit (). Configúrelo con ulimit en su script /etc/init.d bash. Ese es el script de servicio que inicia su proceso.

Si el proceso tiene un archivo de configuración, como el supervisor d, puede usar ese archivo de configuración para establecer el número de archivos y hacer que el proceso realice la llamada directamente a setrlimits ().

Supervisor: 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
fuente
0

La forma de RedHat, como se describe en el artículo 253043 (se requiere suscripción) es agregar declaraciones ulimit apropiadas a /etc/sysconfig/<service name>. Por ejemplo:

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

(Use el archivo existente para su servicio en lugar de myServiceName).

Para los demonios que comienzan sin usar el script "sysconfig" de RedHat, necesitará agregar las líneas ulimit apropiadas al script de inicio del demonio.

Steve Bonds
fuente
-1

Intente configurarlo en el archivo /etc/sysctl.conf

siupakabras
fuente
Hay partes de configuración requeridas para hacer esto que pertenecen a sysctl.conf, y están en su lugar: solo necesitamos modificar ulimits para permitir el acceso a esas páginas enormes.
jayofdoom
-1

De hecho, escribí un libro de cocina de chef privado que se utiliza para establecer ulimit para nosotros y funciona bastante bien. Para ubuntu, encontramos que se requiere el siguiente truco si desea una configuración global de ulimit:

Agregue lo siguiente a su sesión común:

session required        pam_limits.so

y en limit.conf debes tener lo siguiente:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

La parte raíz es importante ya que parece que algunos scripts de inicio no funcionarán correctamente. Así que tenemos un libro de cocina de chef que configura lo siguiente y funciona muy bien.

Otra opción que solíamos usar para Tomcat era implementar Tomcat y luego sobrescribir el script de inicio con una costumbre para la que estableceríamos el ulimit y reiniciar tomcat. Esto funciona muy bien, pero es un poco más hacky que el primero.

Espero que esto ayude, y tal vez algún día pueda abrir el libro de cocina que tenemos internamente ya que es bastante simple pero podría ser útil para otros como usted.

Zuhaib
fuente
Esto no resolverá el problema del póster. Pam solo se invoca cuando un usuario abre una sesión (shell). Dado que el sistema init se inicia independientemente de las sesiones de usuario, pam no se aplica.
Patrick