[server] 부팅시 서비스에 대한 ulimits를 설정하는 방법은 무엇입니까?

mysql이 큰 페이지를 사용하려면 ulimit를 설정해야합니다. limits.conf 에서이 작업을 수행했습니다. 그러나 limits.conf (pam_limits.so)는 init에 대해서는 읽지 않고 “실제”쉘에 대해서만 읽습니다. initscript 시작 함수에 “ulimit -l”을 추가하여이 문제를 해결했습니다. 상자를 요리사와 함께 관리하므로 실제로 반복 가능한 방법이 필요합니다. RPM이 실제로 소유 한 파일을 인수하고 싶지 않습니다.



답변

$ 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 단계는 시스템 제한을 즉시 변경할 수 있으며 재부팅 후에도 계속 작동 할 수 있습니다. 원하는대로 “102400”수를 Linux 시스템의 최대 열린 파일 수로 변경할 수 있습니다. 과

$ sysctl -p

지정된 파일에서 sysctl 설정을로드하거나 지정된 파일이 없으면 /etc/sysctl.conf를로드합니다.


답변

/etc/sysctl.conf는 ulimits 항목을 설정할 수 있어야합니다. 나는 이것을 잘 테스트 할 수 없었지만 설문 조사에 따르면 sysctl.conf에 설정된 후에 중지 할 수 있어야한다고 말합니다.

그래도 여전히 문제가 있음을 보여주는 다양한 주제를 찾았으며 팀과 관련하여 몇 가지 옵션에 대해 논의했으며 두 가지 잠재적 해결 방법을 찾았습니다.

옵션 1 : 대부분의 rhit initscripts 소스 /etc/init.d/functions, 거기에서 ulimit 설정을 변경할 수 있습니다

옵션 2 : init는 / it / initscript가 http://linux.die.net/man/5/initscript를 참조 하십시오 . 흥미롭게도 사람들이 ulimit =)를 설정할 수있는 곳을 말합니다.


답변

이 URL을 기반으로하는 자 급식 레시피 스 니펫 :

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

레시피 스 니펫 :

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


답변

내 솔루션은 단순히 요리사 레시피 에서이 작업을 수행하는 것입니다.

# 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

이로 인해 ulimit -l모든 initscript가 설정되어 일부 환경에서는 바람직하지 않지만 내 경우에는 적합합니다.

완벽한 세계에서 RPM을 업데이트하여을 포함하도록 /etc/sysconfig/mysqld하고 동일한 ulimit -l 명령을 거기에 넣습니다.


답변

이것이 배포판에 특정한지 확실하지 않지만 /etc/security/limits.d/20-somefile.conf우분투에서 사용하여 보안 제한 증가를 통합했습니다 .

기존 파일을 수정하지 않고 요리 책에 ERB 템플릿이 있고 속성 파일에서 기본 속성을 설정 한 다음 “insert_line_if_no_match”항목이 포함 된 루비 블록 사용에 대해 걱정할 필요가 없습니다. 레시피는 다음과 같이 조금 더 읽기 쉽습니다.

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

그리고 이것은 내 템플릿 파일입니다.

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


답변

매뉴얼 페이지에 따르면 ulimit는 더 이상 사용되지 않습니다. setrlimit를 사용해야합니다. 문제는 bash 명령 대신 시스템 호출입니다.

나는 감독자 와이 문제가 있었고 이것이 내가 알게 된 것입니다. 프로세스에 setrlimit () 시스템 호출을 호출 할 수있는 구성 파일이없는 경우 /etc/init.d bash 스크립트에서 ulimit로 설정하십시오. 프로세스를 시작하는 서비스 스크립트입니다.

프로세스에 감독자 d와 같은 구성 파일이있는 경우 해당 구성 파일을 사용하여 파일 수를 설정하고 프로세스가 setrlimits ()를 직접 호출하도록 할 수 있습니다.

감독자 :
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/


답변

기사 253043 (구독 필요)에 설명 된대로 RedHat 방식 은에 적절한 ulimit 문을 추가하는 것 /etc/sysconfig/<service name>입니다. 예를 들면 다음과 같습니다.

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

(myServiceName 대신 기존 서비스 파일을 사용하십시오.)

RedHat “sysconfig”스크립트를 사용하지 않고 시작하는 데몬의 경우 데몬 시작 스크립트에 적절한 ulimit 행을 추가해야합니다.