Come impostare ulimits per un servizio a partire dal boot?


18

Ho bisogno, per mysql di usare le pagine di grandi dimensioni, di impostare un ulimit - l'ho fatto in limits.conf. Tuttavia, limits.conf (pam_limits.so), non viene letto per init, ma solo per shell "reali". Ho risolto questo problema aggiungendo un "ulimit -l" alla funzione di avvio di initscript. Ho bisogno di un modo ripetibile per farlo, ora che le scatole sono gestite con lo chef e non vogliamo prendere in consegna un file che è effettivamente di proprietà dell'RPM.


Dai un'occhiata per vedere se stai colpendo lo stesso bug. serverfault.com/questions/415570/…
Minto Joseph

Risposte:


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

I 4 passaggi possono modificare immediatamente i limiti del sistema e possono comunque funzionare dopo il riavvio. Puoi cambiare il numero "102400" con il numero massimo di file aperti nel tuo sistema Linux come desideri. e

$ sysctl -p

caricare nelle impostazioni sysctl dal file specificato o /etc/sysctl.conf se non specificato.


2
limits.conf non viene letto da inittab perché limit.so non viene letto per questo. Potresti essere in grado di hackerare PAM ma non riesco a capire quale file possa leggere.
Xarses,

Si noti che il carattere jolly *non funziona per l' rootutente, è necessario specificare rootesplicitamente ...
Matt

@Xarses ha ragione. limit.conf non verrà applicato per alcuni demoni a partire all'avvio. Non credo che questo risponda alla domanda.
Alchimista,

2

/etc/sysctl.conf dovrebbe essere in grado di impostare gli elementi ulimits. Non sono stato in grado di testarlo bene, ma il sondaggio dice che dovresti riuscire a fermarti dopo che è impostato in sysctl.conf.

Ho trovato vari argomenti che dimostrano che è ancora un problema e il mio team e ho discusso alcune opzioni in merito a questo abbiamo trovato due possibili soluzioni alternative.

Opzione 1: la maggior parte degli initscripts di rhel fonte /etc/init.d/functions, è possibile modificare le impostazioni ulimit lì

Opzione 2: init afferma che / etc / initscript proviene ogni volta che init genera qualsiasi cosa vedere: http://linux.die.net/man/5/initscript . È interessante notare che dicono che è dove le persone possono impostare ulimit =)


1

Frammento di ricetta autonomo basato su questo URL:

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

Snippet di ricetta:

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

0

La mia soluzione era semplicemente fare questo nella nostra ricetta dello 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

Questo fa sì ulimit -lche venga impostato per tutti gli initscripts, il che può essere indesiderabile in alcuni ambienti, ma va bene per il mio.

In un mondo perfetto, ottenere RPM aggiornato per includere a /etc/sysconfig/mysqld, e inserire lo stesso comando ulimit -l.


0

Non sono sicuro di quanto sia specifico la distro, ma ho appena incorporato un aumento del limite di sicurezza utilizzando /etc/security/limits.d/20-somefile.confin Ubuntu.

Invece di dover modificare un file esistente, ho un modello ERB nel mio ricettario, ho impostato gli attributi di default in un file di attributi e quindi non devo preoccuparmi di usare blocchi ruby ​​con roba "insert_line_if_no_match" - che sembra un po 'più intricato e la ricetta è un po 'più leggibile in questo modo:

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

e quindi questo è il mio file modello:

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

0

secondo la pagina man ulimit è deprecato. Devi usare setrlimit. Il problema è che è una chiamata di sistema anziché un comando bash.

Ho avuto questo problema con il supervisore e questo è quello che ho scoperto. Se il processo non ha un file di configurazione che consente di effettuare una chiamata alla chiamata di sistema setrlimit (). Impostalo con ulimit sul suo script /etc/init.d bash. Questo è lo script di servizio che avvia il processo.

Se il processo ha un file di configurazione, come il supervisore d, è possibile utilizzare quel file di configurazione per impostare il numero di file e fare in modo che il processo effettui la chiamata direttamente a setrlimits ().

Supervisore: 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/


0

Il modo RedHat, come descritto nell'articolo 253043 (è richiesta la sottoscrizione) è aggiungere istruzioni ulimit appropriate a /etc/sysconfig/<service name>. Per esempio:

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

(Usa il file esistente per il tuo servizio invece di myServiceName.)

Per i demoni che si avviano senza utilizzare lo script "sysconfig" di RedHat, è necessario aggiungere le righe ulimit appropriate allo script di avvio del daemon.


-1

Prova a configurarlo nel file /etc/sysctl.conf


Ci sono pezzi di configurazione richiesti per farlo che appartengono a sysctl.conf, e quelli sono a posto - dobbiamo solo modificare le ulimits per consentire l'accesso a quegli hugepage.
jayofdoom,

-1

In realtà ho scritto un libro di cucina per chef privato che viene utilizzato per impostare ulimit per noi e funziona abbastanza bene. Per Ubuntu abbiamo trovato il seguente trucco se si desidera un'impostazione globale ulimit:

Aggiungi quanto segue alla tua sessione comune:

session required        pam_limits.so

e in limit.conf è necessario disporre di quanto segue:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

La parte radice è importante come sembra senza che alcuni script init non funzionino correttamente. Quindi abbiamo un libro di cucina per chef che imposta quanto segue e funziona benissimo.

Un'altra opzione che usavamo per Tomcat era quella di distribuire Tomcat e quindi sovrascrivere lo script init con una personalizzazione per la quale avremmo impostato l'ulimit e riavviato tomcat. Funziona benissimo ma è un po 'più confuso del primo.

Spero che questo aiuto, e forse un giorno potrò aprire il libro di cucina che abbiamo internamente poiché è piuttosto semplice ma potrebbe essere utile ad altri come te.


Questo non risolverà il problema del poster. Pam viene invocato solo quando un utente apre una sessione (shell). Poiché il sistema init viene avviato indipendentemente dalle sessioni utente, pam non si applica.
Patrick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.