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


18

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


같은 버그가 발생했는지 확인하십시오. serverfault.com/questions/415570/…
Minto Joseph

답변:


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

$ sysctl -p

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


2
limit.so를 읽을 수 없으므로 inittab에서 limits.conf를 읽을 수 없습니다. PAM을 해킹 할 수는 있지만 읽을 수있는 파일을 알 수 없습니다.
Xarses

와일드 카드 *root사용자에게 작동하지 않으므로 root명시 적으로 지정해야합니다 .
Matt

@Xarses가 맞습니다. 부팅 할 때 시작되는 일부 데몬에는 limit.conf가 적용되지 않습니다. 나는 이것이 질문에 대한 답을 믿지 않는다.
연금술사

2

/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 =)를 설정할 수있는 곳을 말합니다.


1

이 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

0

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

# 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 명령을 거기에 넣습니다.


0

이것이 배포판에 특정한지 확실하지 않지만 /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] %>

0

매뉴얼 페이지에 따르면 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/


0

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

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

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

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


-1

/etc/sysctl.conf 파일에서 설정해보십시오


sysctl.conf에 속하는 구성을 수행하는 데 필요한 구성 조각이 있으며 그 구성 요소가 있습니다. 이러한 거대한 페이지에 액세스 할 수 있도록 ulimits 만 수정하면됩니다.
jayofdoom

-1

나는 실제로 우리를 위해 ulimit를 설정하는 데 사용되는 개인 요리사 요리 책을 썼으며 꽤 잘 작동합니다. 우분투의 경우 전역 ulimit 설정을 원하면 다음과 같은 트릭이 필요합니다.

공통 세션에 다음을 추가하십시오.

session required        pam_limits.so

limit.conf에는 다음이 있어야합니다.

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

루트 부분은 init 스크립트가 제대로 작동하지 않는 것처럼 보이므로 중요합니다. 그래서 우리는 다음을 설정하는 요리사 요리 책을 가지고 있으며 훌륭하게 작동합니다.

Tomcat에 사용했던 또 다른 옵션은 Tomcat을 배포 한 다음 init 스크립트를 덮어 쓰고 ulimit에 대한 ulimit를 설정하고 Tomcat을 다시 시작하는 사용자 지정으로 덮어 씁니다. 이것은 훌륭하게 작동하지만 첫 번째보다 약간 해키입니다.

이 도움이 되길 바랍니다. 언젠가는 내부적으로 요리 책을 오픈 소스로 오픈 소스로 만들 수 있지만, 여러분과 같은 다른 사람들에게 도움이 될 수 있습니다.


이것은 포스터의 문제를 해결하지 못합니다. Pam은 사용자가 세션 (쉘)을 열 때만 호출됩니다. init 시스템은 사용자 세션과 독립적으로 시작되므로 pam은 적용되지 않습니다.
Patrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.