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

최근에 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’로 실행 중이며 한계가 증가한 이후 서버가 재부팅되었습니다. 우리는 데비안 스퀴즈에 있습니다.



답변

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제한을 제공하는 방법이 있는지 구성을 확인하십시오 .


답변

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

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

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

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


답변

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


답변