"새 소켓을 만들 수 없습니다: 열린 파일이 너무 많습니다"라는 오류가 많이 발생하기 시작한 Ruby 애플리케이션이 있으며 최근에 아래와 같이 "etc/security/limits.conf"를 업데이트했습니다.
root soft nofile 6553600
root hard nofile 6553600
nobody soft nofile 655360
nobody soft nofile 655360
mysql hard nofile 655360
mysql hard nofile 655360
* soft nofile 81920
* hard nofile 65000
* - nofile 102400
fs.file-max = 90000
/etc/sysctl.conf에서도 업데이트되었습니다.
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 62459
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 10240
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 62459
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit-n
10240
하지만 Ruby 프로세스의 파일 열기 제한은 여전히 1024입니다.
cat /proc/13765/limits (pid of ruby app)
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 62459 62459 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 62459 62459 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
Ruby 프로세스는 1024개 이상의 파일을 사용하고 있습니다.
lsof -p 13765 | wc -l
1070
이 Ruby 프로세스/응용 프로그램의 "최대 열린 파일" 값을 어떻게 늘릴 수 있나요?
답변1
/etc/security/limits.conf
다음과 같이 업데이트했습니다 .
이는 다음으로 인해 발생합니다.pam_limits.so, 따라서 사용자 로그인과 같이 PAM을 통과하는 모든 것에 대해서만 적용됩니다.
고쳐 쓰다
/etc/sysctl.conf
일부 시작 스크립트에서 이를 읽을 수 있으므로 변경 사항은 재부팅 후에만 적용됩니다... ( systemd-sysctl.service
Debian에는 레거시 스크립트가 있습니다.)/etc/init.d/procps
요점은 이러한 파일 중 어느 것도 즉시 읽히지 않으며 ulimit에 대한 변경 사항이 실행 중인 프로세스에 적용되지 않는다는 것입니다.
이 Ruby 프로세스/응용 프로그램의 "최대 열린 파일" 값을 어떻게 늘릴 수 있나요?
시작된 원인을 찾아 거기에서 ulimit를 변경하고 프로세스를 다시 시작하십시오. 명령줄에서 시작하는 경우 셸의 제한을 변경하고 다시 시작하면 작동할 것입니다. init/systemd/what에서 실행하는 경우 올바른 구성을 찾아야 할 수도 있습니다.