Das Limit für geöffnete Dateien des Daemons ist erreicht, obwohl die Systemlimits erhöht wurden.

Das Limit für geöffnete Dateien des Daemons ist erreicht, obwohl die Systemlimits erhöht wurden.

Ich verwende Debian Wheezy. Die Dateilimits sind für jeden Benutzer auf 100.000 erhöht. ulimit -aUnd ulimit -Hn/ -Snzeigt mir die korrekten Mengen der maximal offenen Dateilimits sogar auf dem Bildschirm an. Aber aus irgendeinem Grund kann ich nicht mehr als ~4000 Verbindungen / offene Dateien haben.

aus 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

Ausgabe von 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

zum Beispiel Redis:

Kunde: Benchmark mit 100 Kunden

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

Serverinfo:

127.0.0.1:6379> info clients
-Clients
connected_clients:4005
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

Java:

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 -lzeigt ~4000 Deskriptoren

Antwort1

Es gibt zwei Einstellungen, die die Anzahl der offenen Dateien begrenzen: eine Begrenzung pro Prozess und eine systemweite Begrenzung. Die systemweite Begrenzung wird durch fs.file-maxsysctl festgelegt, das in/etc/sysctl.conf(beim Booten gelesen) oder im laufenden Betrieb mit demsysctloder durch Schreiben in /proc/sys/fs/file-max. Das Limit pro Prozess wird durch festgelegt ulimit -n.

Das Limit pro Prozess wird von jedem Prozess von seinem übergeordneten Prozess übernommen. Ein Standardwert kann in/etc/security/limits.conf, aber dies gilt nur für interaktive Sitzungen, nicht für Daemons, die beim Booten gestartet werden. Es gilt nur für einen Daemon, wenn dieser über eine interaktive Sitzung gestartet wird.

Um die Prozesslimits für einen Daemon zu erhöhen (oder zu verringern), bearbeiten Sie im Allgemeinen sein Startskript und fügen Sie ulimitkurz vor dem Start des Daemons einen Aufruf hinzu. Das Debian-Redis-Paket enthält eine Konfigurationseinstellung in einer separaten Datei: /etc/default/redis. Kommentieren Sie die ULIMIT=Zeile aus und erhöhen Sie den Wert bei Bedarf.

verwandte Informationen