Làm cách nào để đặt ulimits cho dịch vụ bắt đầu khi khởi động?


18

Tôi cần, để mysql sử dụng các trang lớn, để thiết lập một ulimit - Tôi đã thực hiện điều này trong giới hạn. Tuy nhiên, giới hạn.conf (pam_limits.so), không được đọc trong init, chỉ dành cho shell "thực". Tôi đã giải quyết điều này trước khi thêm "ulimit -l" vào hàm bắt đầu initscript. Tôi cần một số cách lặp lại để làm điều này, bây giờ các hộp được quản lý với đầu bếp và chúng tôi không muốn tiếp quản một tệp thực sự thuộc sở hữu của RPM.


Xin vui lòng xem nếu bạn đang gặp lỗi tương tự. serverfault.com/questions/415570/ trộm
Minto Joseph

Câu trả lời:


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 bước có thể thay đổi giới hạn hệ thống của bạn ngay lập tức và vẫn có thể hoạt động sau khi khởi động lại. Bạn có thể thay đổi số "102400" thành số tệp mở tối đa trong hệ thống linux của bạn như bạn muốn. và

$ sysctl -p

để tải trong cài đặt sysctl từ tệp được chỉ định hoặc /etc/sysctl.conf nếu không được cung cấp.


2
inittab không được đọc bởi inittab vì giới hạn.so không được đọc cho nó. Bạn có thể hack PAM nhưng tôi không thể tìm ra tập tin nào có thể đọc được.
Xarses

Lưu ý rằng ký tự đại diện *không hoạt động cho rootngười dùng, bạn sẽ phải chỉ định rootrõ ràng ...
Matt

@Xarses là đúng. Giới hạn sẽ không được áp dụng cho một số daemon bắt đầu khi khởi động. Tôi không tin điều này trả lời câu hỏi.
Nhà giả kim

2

/etc/sysctl.conf sẽ có thể đặt các mục ulimits. Tôi đã không thể kiểm tra tốt điều này nhưng cuộc khảo sát nói rằng bạn sẽ có thể dừng lại sau khi nó được đặt trong sysctl.conf.

Tôi đã tìm thấy nhiều chủ đề cho thấy nó vẫn còn là một vấn đề và nhóm của tôi và tôi đã thảo luận về một số tùy chọn xung quanh vấn đề này, chúng tôi đã tìm thấy hai cách giải quyết tiềm năng.

Tùy chọn 1: Hầu hết các nguồn initscripts /etc/init.d/fifts, bạn có thể thay đổi cài đặt ulimit ở đó

Tùy chọn 2: init tuyên bố rằng / etc / initscript có nguồn gốc mọi lúc trước khi init sinh ra bất cứ điều gì nhìn thấy: http://linux.die.net/man/5/initscript . Thật thú vị khi họ nói rằng đó là nơi mọi người có thể đặt ulimit =)


1

Đoạn mã công thức độc lập dựa trên url này:

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

Đoạn trích công thức:

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

Giải pháp của tôi chỉ đơn giản là làm điều này trong công thức đầu bếp của chúng tôi:

# 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

Điều này gây ra việc ulimit -lđược thiết lập cho tất cả các bản inits, có thể không mong muốn trong một số môi trường, nhưng đối với tôi thì tốt.

Trong một thế giới hoàn hảo, tôi sẽ cập nhật RPM để bao gồm một /etc/sysconfig/mysqldvà đặt lệnh ulimit -l tương tự vào đó.


0

Không chắc chắn về cách thức phân phối cụ thể này, nhưng tôi vừa kết hợp tăng giới hạn bảo mật bằng cách sử dụng /etc/security/limits.d/20-somefile.conftrong Ubuntu.

Thay vì phải sửa đổi một tệp hiện có, tôi có một mẫu ERB trong sách nấu ăn của mình, đặt các thuộc tính mặc định trong tệp thuộc tính và sau đó không phải lo lắng về việc sử dụng các khối ruby ​​với công cụ "insert_line_if_no_match" - điều đó có vẻ phức tạp hơn một chút và công thức dễ đọc hơn một chút như thế này:

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

và đây là tập tin mẫu của tôi:

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

0

theo người đàn ông trang ulimit bị phản đối. Bạn cần sử dụng setrlimit. Vấn đề là một cuộc gọi hệ thống thay vì lệnh bash.

Tôi đã có vấn đề này với người giám sát và đây là những gì tôi phát hiện ra. Nếu quy trình không có tệp cấu hình cho phép bạn thực hiện cuộc gọi đến cuộc gọi hệ thống setrlimit (). Đặt nó với ulimit trên tập lệnh bash /etc/init.d của nó. Đó là kịch bản dịch vụ bắt đầu quá trình của bạn.

Nếu quy trình có tệp cấu hình, như giám sát viên d thì bạn có thể sử dụng tệp cấu hình đó để đặt số lượng tệp và thực hiện quy trình thực hiện cuộc gọi trực tiếp đến setrlimits ().

Người giám sát: http://supervisord.org/configuration.html#supervisord-section-sinstall

TomcaT: http://www.jayway.com/2012/02/11/how-to-really-fix-the-too-many-open-files-probols-for-tomcat-in-ub Ubuntu /


0

Cách RedHat, như được mô tả trong điều 253043 (yêu cầu đăng ký) là thêm các tuyên bố ulimit thích hợp vào /etc/sysconfig/<service name>. Ví dụ:

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

(Sử dụng tệp hiện có cho dịch vụ của bạn thay vì myServiceName.)

Đối với các trình tiện ích bắt đầu mà không sử dụng tập lệnh "sysconfig" của RedHat, bạn sẽ cần thêm các dòng ulimit thích hợp vào tập lệnh khởi động trình nền.


-1

Hãy thử thiết lập nó trong tập tin /etc/sysctl.conf


Có một số cấu hình được yêu cầu để thực hiện điều này thuộc về sysctl.conf và chúng được đặt đúng chỗ - chúng ta chỉ cần sửa đổi các lỗ hổng để cho phép các truy cập đó được truy cập.
jayofdoom

-1

Tôi thực sự đã viết một cuốn sách dạy nấu ăn riêng được sử dụng để đặt ulimit cho chúng tôi và nó hoạt động khá tốt. Đối với Ubuntu, chúng tôi đã tìm thấy thủ thuật sau đây là bắt buộc nếu bạn muốn cài đặt ulimit toàn cầu:

Thêm phần sau vào phiên chung của bạn:

session required        pam_limits.so

và trong giới hạn. bạn phải có những điều sau đây:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

Phần gốc rất quan trọng vì dường như không có một số script init sẽ không hoạt động chính xác. Vì vậy, chúng tôi có một cuốn sách nấu ăn đầu bếp thiết lập như sau và nó hoạt động rất tốt.

Một tùy chọn khác mà chúng tôi thường sử dụng cho Tomcat là triển khai Tomcat và sau đó ghi đè lên tập lệnh init bằng một tùy chỉnh mà chúng tôi sẽ đặt ulimit cho và khởi động lại tomcat. Điều này hoạt động tuyệt vời nhưng là một chút hacky sau đó đầu tiên.

Tôi hy vọng sự giúp đỡ này, và có thể một ngày nào đó tôi có thể mở ra cuốn sách nấu ăn mà chúng tôi có trong nội bộ vì nó khá đơn giản nhưng có thể hữu ích cho những người khác như bạn.


Điều này sẽ không giải quyết vấn đề của bưu điện. Pam chỉ được gọi khi người dùng mở một phiên (shell). Vì hệ thống init được khởi động độc lập với phiên người dùng, pam không áp dụng.
Patrick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.