특정 프로세스의 ulimit 수정 (파일 열기)


27

그것은 변경할 수 있습니다 - 소프트하드 제한 (A)의 특정의 과정을?

제 경우에는 프로세스가 진행 mongod중이며 많은 웹 리소스가 간단히 실행하도록 알려줍니다.

ulimit -n <my new value>

내 현재 생각 :

  • 명령은 내가 수정할 프로세스 의 한계를 어떻게 알 수 있습니까? 이것이 전체 시스템 열린 파일 제한을 수정하지 않습니까?
  • 이 명령은 소프트 제한 만 변경한다고 생각합니다. 그렇다면 하드 한계를 높일 수있는 방법이 있습니까?

이 귀중한 정보를 읽었습니까? docs.mongodb.org/manual/reference/ulimit
tink

네, 마음껏 배웠습니다. 뭔가 빠졌는지 확실하지 않지만 해당 페이지에는 세부 정보를 보는 방법 만 알려줍니다. 그것은 단지 당신에게 ulimit -n <value>를 쓰라고 알려줍니다.
테스트

답변:


29

프로세스는 setrlimit(2)시스템 호출을 통해 한계를 변경할 수 있습니다 . 당신이 실행 ulimit -n하면 숫자가 나타납니다. 프로세스의 열린 파일 설명자 (파일, 소켓, 파이프 등 포함)의 수에 대한 현재 제한입니다. 이 ulimit명령 getrlimit(2)은 현재 값이 무엇인지 찾기 위해 시스템 호출을 실행했습니다 .

핵심은 다음과 같습니다. 프로세스는 부모 프로세스에서 현재 제한을 상속합니다. 따라서 실행하는 경우 ulimit -n 64열린 파일 디스크립터의 해당 쉘 한계를 64로 설정합니다 setrlimit(). 새 프로세스가 적절하게 호출되지 않는 한 쉘이 시작하는 모든 프로세스는 동일한 한계를 갖습니다 .

mongodb's열린 파일 설명자 제한 을 변경하려면 ulimit -n 2048쉘에서 (또는 커널이 허용하는 많은 수의) 실행 하십시오. 그런 다음 해당 셸을 사용하여 시작 mongodb합니다. 자식 프로세스로서 mongodb열린 파일 설명자에 대한 (큰) 제한을 상속합니다.

모든 프로세스 열린 파일 디스크립터 한계의 합과 같이 시스템의 열린 파일 한계를 수정하려면 modify /etc/sysctl.conf및 run과 같은 작업을 수행해야 합니다 sysctl -p. 의 fs.file-max매개 변수 값을 확인하십시오 /etc/sysctl.conf.


대단한 설명입니다! 대단히 감사합니다. 나는 이것을 즉시 시도 할 것이다!
테스트

이 답변은 많은 도움이되었지만 이제 문제는 하드 한계가 2048이라는 것입니다.이 경우 충분하지 않습니다. 1) 커널이 허용하는 한계를 어떻게 찾을 수 있습니까? 2) 지금 HARD LIMIT를 변경할 수 있습니까? 다시 감사합니다!
테스트

@test-나는 절대 한계를 제기하지 않았습니다. 이것을 찾았습니다 : blog.samat.org/2011/04/05/… 그리고이 wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux 그들은 같은 것을 말합니다.
브루스 Ediger

18

실행중인 프로세스의 한계를 변경하려면 유틸리티 명령을 사용할 수 있습니다 prlimit.

prlimit --pid 12345 --nofile=1024:1024

내부적으로하는 것은 전화하는 것 setrlimit(2)입니다. prlimit의 매뉴얼 페이지에는 유용한 호출 예제가 포함되어야합니다.

출처 : https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/


덕분에 하루를 구할 수있었습니다. 감사합니다. too many files open오류 가 발생한 Python 프로세스가 오래 실행되었습니다 . 귀하의 답변으로 프로세스가 중단되지 않고 문제가 해결되었습니다.
Visionscaper

1

적어도 리눅스에서는 대부분의 배포판이 인증에 pam을 사용하는 것 같습니다. pam과 함께 제공되는 하나의 모듈은 limits 모듈입니다. pam_limits에 대한 README 인용 :

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

결과적으로 사용자 별, 그룹 별 및 기본 제한을 하드 범주 (루트가이를 설정하고 프로세스가 더 높은 수준을 요청할 수 없음)와 소프트 제한 모두에서 설정할 수 있습니다. 소프트 한계는 일반적으로 하드 한계보다 낮게 설정되며, 앱은 하드 한계에 도달 할 때까지 위쪽으로 늘릴 수 있습니다.

귀하의 경우, 일반 사용자로서 실행 한계를 늘리려는 프로세스 인 경우 해당 사용자 또는 그룹에 대한 한계를 늘릴 수 있습니다. 예를 들어, 추가 파일 핸들을 열어야하는 일부 서버에는 mysql cron 작업이 있으므로 다음과 같이 설정하십시오.

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

다시 시작할 필요가 없습니다. 해당 사용자에게 접근하면 새 제한이 적용되는 것을 즉시 확인할 수 있습니다.

일반적인 RedHat 파생 시스템에있는 경우 수행 할 수있는 또 다른 작업은 원하는 ulimit 호출을 / etc / sysconfig / $ SERVICE 스크립트에 넣는 것입니다. 예를 들어, apache의 init 스크립트 이름은 /etc/init.d/httpd이며 / etc / sysconfig / httpd 구성 파일이 있으면이를 소스로합니다. rpm이 업그레이드 될 때 init 스크립트가 업데이트되기 때문에 init 스크립트 자체를 편집하는 대신 이것을 수행하는 것이 더 쉽다는 것을 알았습니다. 그러나 sysconfig 파일은 기본값에서 변경되지 않은 경우에만 업데이트됩니다.


가장 실용적인 솔루션.
nelaaro

0

명령은 수정할 프로세스의 한계를 어떻게 알 수 있습니까? 이렇게하면 전체 시스템 열린 파일 제한이 수정되지 않습니까?

이 명령은 현재 프로세스 (쉘)와 자식 프로세스 (쉘에서 이후에 실행되는 모든 프로세스)에 대한 제한을 변경합니다.

프로세스는 트리로 구성됩니다. 모든 프로세스에는 부모가 있습니다 (호출 한). 프로세스 번호 1 init는 자신의 부모라는 특별한 프로세스입니다. htop 또는 top과 같은 도구는 부모 및 자식 트리로 표시되는 프로세스를 표시 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.