Bagaimana cara mengatur ulimits untuk layanan yang dimulai saat boot?

18

Saya perlu, agar mysql menggunakan halaman-halaman besar, untuk menetapkan sebuah ulimit - Saya telah melakukan ini di membatasi.conf. Namun, membatasi.conf (pam_limits.so), tidak bisa dibaca untuk init, hanya untuk shell "nyata". Saya memecahkan ini sebelumnya dengan menambahkan "ulimit -l" ke fungsi awal skrip init. Saya perlu semacam cara yang berulang untuk melakukan ini, sekarang kotak-kotak dikelola dengan koki, dan kami tidak ingin mengambil alih file yang sebenarnya dimiliki oleh RPM.

jayofdoom
sumber
Silakan melihat-lihat untuk melihat apakah Anda memukul bug yang sama. serverfault.com/questions/415570/…
Minto Joseph

Jawaban:

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

4 langkah dapat segera mengubah batas sistem Anda, dan masih dapat berfungsi setelah reboot. Anda dapat mengubah angka "102400" menjadi jumlah file terbuka maks di sistem linux seperti yang Anda inginkan. dan

$ sysctl -p

memuat pengaturan sysctl dari file yang ditentukan atau /etc/sysctl.conf jika tidak ada yang diberikan.

Sofring
sumber
2
limit.conf tidak dibaca oleh inittab karena limit.so tidak dibaca untuk itu. Anda mungkin dapat meretas PAM tapi saya tidak tahu file mana yang mungkin dibaca.
Xarses
Perhatikan bahwa wildcard *tidak berfungsi untuk rootpengguna, Anda harus menentukan rootsecara eksplisit ...
Matt
@ Xarses benar. limit.conf tidak akan diterapkan untuk beberapa daemon mulai saat boot. Saya tidak percaya ini menjawab pertanyaan.
Alchemist
2

/etc/sysctl.conf harus dapat mengatur item ulimits. Saya belum bisa menguji ini dengan baik tetapi survei mengatakan Anda harus bisa berhenti setelah diatur di sysctl.conf.

Saya telah menemukan berbagai topik yang menunjukkan bahwa ini masih merupakan masalah dan tim saya dan saya telah membahas beberapa opsi untuk hal ini, kami telah menemukan dua solusi potensial.

Opsi 1: Sebagian besar sumber skrip init / etc / init.d/functions, Anda dapat mengubah pengaturan ulimit di sana

Opsi 2: init mengklaim bahwa / etc / initcript bersumber setiap kali sebelum init memunculkan apa pun yang dilihat: http://linux.die.net/man/5/initscript . Cukup menarik mereka mengatakan di mana orang dapat mengatur ulimit =)

Xarses
sumber
1

Cuplikan resep lengkap berdasarkan url ini:

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

Cuplikan resep:

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

Solusi saya hanya melakukan ini dalam resep koki kami:

# 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

Ini menyebabkan ulimit -lpengaturan untuk semua skrip init, yang mungkin tidak diinginkan di beberapa lingkungan, tetapi baik untuk tambang.

Di dunia yang sempurna, saya akan mendapatkan RPM yang diperbarui untuk menyertakan a /etc/sysconfig/mysqld, dan menempatkan perintah -l-ulimit yang sama di sana.

jayofdoom
sumber
0

Tidak yakin seberapa spesifik distro ini, tapi saya baru saja memasukkan peningkatan batas keamanan dengan menggunakan /etc/security/limits.d/20-somefile.confdi Ubuntu.

Daripada harus memodifikasi file yang ada, saya memiliki template ERB di buku masak saya, mengatur atribut default dalam file atribut dan kemudian tidak perlu khawatir tentang menggunakan blok ruby ​​dengan hal-hal "insert_line_if_no_match" - yang tampaknya sedikit lebih rumit dan resepnya sedikit lebih mudah dibaca seperti ini:

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

dan kemudian ini adalah file templat saya:

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

menurut halaman manual, ulimit sudah tidak digunakan lagi. Anda perlu menggunakan setrlimit. Masalahnya adalah itu adalah panggilan sistem bukan perintah bash.

Saya punya masalah dengan atasan dan inilah yang saya temukan. Jika proses tidak memiliki file konfigurasi yang memungkinkan Anda melakukan panggilan ke setrlimit () panggilan sistem. Atur dengan ulimit pada skrip bash /etc/init.d. Itulah skrip layanan yang memulai proses Anda.

Jika proses memiliki file konfigurasi, seperti supervisor d maka Anda dapat menggunakan file konfigurasi tersebut untuk mengatur jumlah file dan meminta proses membuat panggilan langsung ke 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
sumber
0

Cara RedHat, seperti dijelaskan dalam artikel 253043 (diperlukan berlangganan) adalah dengan menambahkan pernyataan ulimit yang sesuai /etc/sysconfig/<service name>. Sebagai contoh:

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

(Gunakan file yang ada untuk layanan Anda, bukan myServiceName.)

Untuk daemon yang dimulai tanpa menggunakan skrip RedHat "sysconfig", Anda perlu menambahkan baris ulimit yang sesuai ke skrip startup daemon.

Steve Bonds
sumber
-1

Coba atur itu di file /etc/sysctl.conf

siupakabras
sumber
Ada beberapa konfigurasi yang diperlukan untuk melakukan ini yang termasuk dalam sysctl.conf, dan itu sudah ada - kita hanya perlu memodifikasi ulimit untuk memungkinkan hugepage diakses.
jayofdoom
-1

Saya benar-benar menulis buku masak koki pribadi yang digunakan untuk mengatur ulimit untuk kami dan itu bekerja dengan cukup baik. Untuk ubuntu, kami menemukan trik berikut diperlukan jika Anda menginginkan pengaturan global ulimit:

Tambahkan yang berikut ke sesi umum Anda:

session required        pam_limits.so

dan dalam limit.conf Anda harus memiliki yang berikut:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

Bagian root penting karena tampaknya tanpa beberapa skrip init tidak akan berfungsi dengan benar. Jadi kami memiliki buku masak koki yang menyiapkan yang berikut ini dan berfungsi dengan baik.

Opsi lain yang biasa kami gunakan untuk Tomcat adalah untuk menyebarkan Tomcat dan kemudian menimpa skrip init dengan kebiasaan yang akan kami atur ulimit untuk dan restart tomcat. Ini berfungsi dengan baik tetapi sedikit lebih meretas daripada yang pertama.

Saya harap bantuan ini, dan mungkin suatu hari nanti saya dapat membuka sumber buku masak yang kami miliki secara internal karena sangat sederhana tapi mungkin dapat membantu orang lain seperti Anda.

Zuhaib
sumber
Ini tidak akan menyelesaikan masalah poster. Pam hanya dipanggil ketika pengguna membuka sesi (shell). Karena sistem init dimulai secara independen dari sesi pengguna, pam tidak berlaku.
Patrick