나는 데비안 wheezy를 실행하고 있습니다. 모든 사용자에 대해 파일 제한이 100000으로 늘어났습니다.
ulimit -a
및 ulimit -Hn
/ -Sn
화면에서도 최대 열린 파일 제한의 올바른 양을 보여줍니다. 하지만 어떤 이유로 ~4000개 이상의 연결/열린 파일을 가질 수 없습니다.
에서 sysctl.conf
:
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 500 65000
net.core.somaxconn = 81920
출력 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) 256639
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
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) 256639
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
예를 들어 redis:
클라이언트: 100명의 클라이언트를 대상으로 벤치마크
Writing to socket: Connection reset by peer
Writing to socket: Connection reset by peer
Writing to socket: Connection reset by peer
Writing to socket: Connection reset by peer
Error: Connection reset by peer
서버 정보:
127.0.0.1:6379> info clients
-Clients
connected_clients:4005
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
자바:
Caused by: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: java.net.SocketException: Too many open files
at sun.nio.ch.SelectorProviderImpl.openSocketChannel(Unknown Source)
java.io.IOException: Too many open files
Caused by: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: java.net.SocketException: Too many open files
at sun.nio.ch.SelectorProviderImpl.openSocketChannel(Unknown Source)
Caused by: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: java.net.SocketException: Too many open files
ls -l /proc/[id]/fd | wc -l
~4000개의 설명자를 표시합니다.
답변1
열린 파일 수를 제한하는 설정에는 프로세스별 제한과 시스템 전체 제한이라는 두 가지 설정이 있습니다. 시스템 전체 제한은 fs.file-max
sysctl에 의해 설정되며, 이는 다음에서 구성할 수 있습니다./etc/sysctl.conf
(부팅 시 읽기) 또는sysctl
명령을 내리거나 /proc/sys/fs/file-max
. 프로세스별 제한은 에 의해 설정됩니다 ulimit -n
.
프로세스별 제한은 각 프로세스가 해당 상위 프로세스에서 상속됩니다. 기본값은 다음에서 설정할 수 있습니다./etc/security/limits.conf
, 그러나 이는 부팅 시 시작된 데몬이 아닌 대화형 세션에만 적용됩니다. 이는 대화형 세션을 통해 시작된 경우에만 데몬에 적용됩니다.
데몬에 대한 프로세스별 제한을 늘리거나 줄이려면 일반적으로 시작 스크립트를 편집하고 ulimit
데몬이 시작되기 직전에 호출을 추가합니다. Debian redis 패키지는 별도의 파일에 구성 설정이 포함되어 있습니다: /etc/default/redis
. 해당 행을 주석 처리 ULIMIT=
하고 필요한 경우 값을 늘립니다.