chpst는 ulimit 설정을 존중합니까?

chpst는 ulimit 설정을 존중합니까?

현재 Linux 플랫폼의 JBoss 기반 서버에 문제가 있습니다. 실제로 프로세스 내에서 사용 가능한 파일 핸들이 부족하고 서버가 작동하지 않습니다.

우리는 10000개의 열린 파일 핸들을 허용하도록 ulimit를 설정했으며 훨씬 적은 수의 파일 핸들이 열려 있으면 서버가 지속적으로 충돌합니다.

제가 주목한 한 가지는 시작 스크립트가 chpst를 사용한다는 것입니다. 그리고 chpst를 사용하면 파일/프로세스/메모리 제한을 인수로 설정할 수 있다는 것을 알았습니다. 명시적 명령이 설정되지 않은 경우 chpst가 기존 시스템 ulimit를 준수하는지, 아니면 자체 내부 기본값을 사용하는지 아는 사람이 있습니까? 그렇다면, 이것들은 어디서 찾을 수 있을까요?

감사해요

답변1

chpst는 인수로 전달한 내용도 존중하지 않습니다. 소스 코드는 읽기가 정말 어렵지만 strace는 다음을 확인합니다.

execve("/usr/sbin/chpst", ["chpst", "-o", "10000", "/bin/sh", "-c", "sleep 5"], [/* 26 vars */]) = 0
...
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
setrlimit(RLIMIT_NOFILE, {rlim_cur=4*1024, rlim_max=4*1024}) = 0
execve("/bin/sh", ["/bin/sh", "-c", "sleep 5"], [/* 26 vars */]) = 0
...

나는 피할 것이다.

답변2

Olivier Tharan에 대한 코멘트를 추가할 수 없으며, 오래된 질문이라 할지라도 잘못된 주장을 수정하는 것도 나쁘지 않다고 생각합니다(특히 주장이 상대적으로 최근인 경우).

strace에서 getrlimit는 최대 하드 제한이 4096이라고 말하고 chpst에게 소프트 제한을 10000으로 설정하도록 요청합니다. chpst는 그렇게 하지만 다음 문서에 설명되어 있습니다.limits.conf 관리, 소프트 제한은 커널 및 루트 사용자가 적용하는 하드 제한을 초과할 수 없습니다. 이에 대해 말할 수 있는 유일한 것은 chpst가 경고를 인쇄해야 한다는 것입니다. 그게 전부입니다. 물론 "나는 피하겠다"는 것은 아닙니다.

이는 원래 문제가 chpst와 관련이 없고 시스템 구성과 관련이 있을 수 있음을 의미합니다. chpst는 단일 프로세스에 임의의 제한을 설정하는 도구일 뿐이며 커널을 구성하는 도구는 아닙니다.

관련 정보