특정 프로세스에 적용되지 않는 Ulimit 파일 디스크립터 한계


14

최근에 redis 프로세스 중 하나를 사용하여 적용되는 ulimits를 확인했습니다.

cat /proc/<redis-pid>/limits

그리고 기본값이 낮다는 것을 알게되어 놀랐습니다.

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

우리는 다음과 같이 구성했기 때문에 놀랐습니다.

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

누가 ulimit 증가가 실행중인 redis 프로세스에 적용되지 않는지 말해 줄 수 있습니까?

redis 프로세스가 사용자 'redis'로 실행 중이며 한계가 증가한 이후 서버가 재부팅되었습니다. 우리는 데비안 스퀴즈에 있습니다.

답변:


19

Linux에서는 요구 사항 유형에 따라 다양한 위치에서 리소스 제한을 설정할 수 있습니다.

  1. /etc/security/limits.conf 파일.
  2. /etc/sysctl.conf 파일.
  3. ulimit 명령

/etc/security/limits.confpam_limits의 일부 이므로이 파일에 설정된 한계는 로그인 세션 중에 pam_limits 모듈에서 읽습니다. 로그인 세션은을 ssh통해 또는를 통해 이루어질 수 있습니다 terminal. 그리고 pam_limits는 여기에 언급 된 데몬 프로세스에 영향을 미치지 않습니다 .

/etc/sysctl.conf시스템 전체 전역 구성이므로 여기에서 사용자 별 구성을 설정할 수 없습니다. 모든 사용자 / 프로세스가 사용할 수있는 최대 리소스 양을 설정합니다.

ulimit명령은 쉘의 한계를 설정하는 데 사용됩니다. 따라서 ulimit쉘에 한계가 설정 되면 쉘에서 생성되는 프로세스 child processparent processes속성을 상속하는 규칙으로 인해 해당 값도 가져 옵니다 .

그리고 귀하의 경우, 위 redisinit어느 것도의 일부로 시작 되지 않았 으므로 직접 도움이 될 것입니다. 이를 수행하는 올바른 방법은 ulimit명령을 사용 하여 init 스크립트 자체에서 새 값을 설정 해야한다는 것입니다. 스크립트에서 아래와 같이

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

위시리스트ulimit기능을 추가하기 위한 버그 가 이미 있습니다 start-stop-daemon .

redis제한을 제공하는 방법이 있는지 구성을 확인하십시오 .


훌륭한 요약 칸난! 이제 시작 스크립트에 ulimit를 추가했습니다. (다수의 시작 스크립트가 있기 때문에) deamonized 프로세스로 작업 할 사용자의 한계를 설정하는 방법은 없지만 아쉽습니다. 감사합니다!
UpTheCreek

좋은 대답입니다. 부모 프로세스의 속성을 상속받는 자식 프로세스는 놀랐습니다. 제한은 자식 프로세스를 실행하는 사용자에게는 정확 해 보였지만 사용중인 부모 프로세스 소유자의 한계였습니다.
동기화

2

sysctl fs.file-max 매개 변수는 광범위한 전역 시스템 제한이므로 ulimit의 동일한 값을 설정하는 것이 좋습니다.

ulimit 100000 및 sysctl.conf 100000에서도 설정하면 한 명의 사용자가 시스템을 차단할 수 있습니다

어쨌든 문제에 대해 이야기하면 시스템에서 pam_limits를 사용합니다.

man pam_limits
grep -i limit /etc/pam.d/*

감사합니다-fs.file-max 값을 올리는 것을 고려하겠습니다. pam과 관련하여-우리는 이것을 사용하고 있다고 생각합니다 (질문에 추가 구성을 추가했습니다). 설정 이이 사용자가 사용하지 않는 SSH와 관련이있는 것처럼 보이지만 PAM을 이해하고 있는지 확실하지 않습니다. 구성해야 할 다른 파일이 있습니까? 나는 redis를 위해 init 스크립트에 ulimit 설정을 항상 넣을 수는 있지만 이것을 할 필요는 없습니다.
UpTheCreek

2

sshd에 pam_limits를 활성화했지만이 명령이 SSH 세션에서 실행되고 있습니까? /etc/pam.d/login및 / 또는 /etc/pam.d/su및 / 또는에 같은 줄을 추가해야 할 수도 있습니다 /etc/pam.d/sudo.


감사. 나는 그것이 옳지 않다고 의심했다. 프로세스는 init.d 스크립트에서 다음 줄로 시작 if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS됩니다. 이 경우 어떤 pam이 적합합니까?
UpTheCreek

스크립트에서 ulimit -n 100000
c4f4t0r

init.d 스크립트가 su [user] -c명령을 사용하여 다른 사용자로 스크립트를 시작 합니까 , 아니면 프로그램이 루트로 실행됩니까? 를 사용하는 경우에 su넣습니다 /etc/pam.d/su. 로 실행 중이 root라면 ulimitinit 스크립트에 명령 을 추가하라는 c4f4t0r의 제안을 따르는 것이 좋습니다 . root원하는 제한을 설정할 수 있으므로 해당 사례에 대한 팸에 대해 걱정할 필요가 없습니다.
Omnipresence

1
감사. 에 사용 --chuid redis:redis합니다 start-stop-daemon. 시작 스크립트에 ulimit를 추가했습니다.
UpTheCreek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.