Come impostare ulimit per un servizio a partire dall'avvio?

Ho bisogno, per mysql di usare grandi pagine, di impostare un ulimit – lo ho fatto in limiti.conf. Tuttavia, limiti.conf (pam_limits.so), non viene letto in init, solo per shell "reali". Ho risolto questo prima aggiungendo un "ulimit -l" alla function di avvio initscript. Ho bisogno di una sorta di modo ripetibile per farlo, ora che le caselle sono gestite con lo chef e non vogliamo assumere un file in realtà posseduto dal RPM.

  • Come assegnare la priorità a SSH per lavorare in caso di carichi elevati della CPU
  • Utilizzando strumenti mongodb (mongodump, mongorestore) da un'altra macchina
  • Perché stack di networking ignorando icmp risponde dall'interface non predefinita?
  • S3 Interfacce per backup, ecc
  • Fai sshd ascoltare un'interface specifica
  • Mostra data / ora in netstat
  • 8 Solutions collect form web for “Come impostare ulimit per un servizio a partire dall'avvio?”

    $ 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 tuo sistema e possono ancora funzionare dopo il riavvio. È ansible modificare il numero "102400" sul numero massimo di file aperti nel tuo sistema Linux come vuoi. e

     $ sysctl -p 

    per caricare nelle impostazioni sysctl dal file specificato o /etc/sysctl.conf se nessuno viene fornito.

    /etc/sysctl.conf dovrebbe essere in grado di impostare gli elementi ulimits. Non sono stato in grado di testare questo bene, ma l'indagine dice che si dovrebbe essere in grado di arrestare dopo che è impostato in sysctl.conf.

    Ho trovato vari argomenti che dimostrano che è ancora un problema e però, e la mia squadra e io abbiamo discusso alcune opzioni intorno a questo abbiamo trovato due soluzioni alternative potenziali.

    Opzione 1: la maggior parte degli initscripts di origine /etc/init.d/functions, è ansible modificare le impostazioni ulimit

    Opzione 2: init afferma che / etc / initscript viene generato each volta che init spawns qualsiasi cosa vedere: http://linux.die.net/man/5/initscript . Abbastanza interessanti dicono che where le persone possono impostare ulimit =)

    Schema di ricetta autonomo basato su questo URL:

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

    Snippet della 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 

    La mia soluzione è stata semplicemente farlo nella ricetta del nostro chef:

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

    Ciò provoca l' ulimit -l per get set per tutti gli initscript, che possono essere indesiderati in alcuni ambienti, ma va bene per la mia.

    In un mondo perfetto, avrei aggiornato l'aggiornamento RPM per includere un /etc/sysconfig/mysqld e mettere in esso l 'stesso command ulimit -l.

    Non sono sicuro di come questo sia distro-specifico, ma ho appena inserito un incremento del limite di sicurezza usando /etc/security/limits.d/20-somefile.conf in Ubuntu.

    Invece di wherer modificare un file esistente, ho un model ERB nel mio libro di cucina, imposta gli attributi predefiniti in un file di attributi e non devi preoccuparti di utilizzare blocchi rubini con roba "insert_line_if_no_match" – che sembra un po 'più intricato e la ricetta è un po 'più leggibile come questa:

     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 poi questo è il mio file di template:

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

    secondo la pagina dell'uomo ulimit è deprecata. È necessario utilizzare setrlimit. Il problema è che è una chiamata di sistema invece di un command bash.

    Ho avuto questo problema con il supervisore e questo è quello che ho scoperto. Se il process non dispone di un file di configuration 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 inizia il process.

    Se il process dispone di un file di configuration, come supervisore d, è ansible utilizzare tale file di configuration per impostare il numero di file e fare in modo che il process 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/

    Provare a impostare questo file nel file /etc/sysctl.conf

    Ho effettivamente scritto un cookbook 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:

    Aggiungere la seguente a una session comune:

     session required pam_limits.so 

    e in limite.conf è necessario disporre di:

     * soft nofile 64000 * hard nofile 65000 root soft nofile 64000 root hard nofile 65000 

    La parte principale è importnte, come sembra, senza che alcuni script init non funzionino correttamente. Quindi abbiamo un cookbook chef che imposta il seguente e funziona grande.

    Un'altra opzione che abbiamo usato per Tomcat era distribuire Tomcat e quindi sovrascrivere lo script init con un custom che avremmo impostato per ulimit e riavviare tomcat. Questo funziona ottimamente, ma è un po 'più scioccante quanto il primo.

    Spero che questo aiuto, e forse un giorno posso aprire il cookbook che abbiamo internamente dal suo abbastanza morto semplice, ma potrebbe essere utile ad altri come te.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.