Wie kann ich die maximale Anzahl von Dateideskriptoren für Daemons erhöhen, die auf Debian Jessie ausgeführt werden?

7

Ich spiele mit pgBouncer als Verbindungspooling-System für PostgreSQL. Mein System ist ein 12-Core-System mit 64 GB RAM und 1 Gbit / s-Netzwerkschnittstelle unter Debian 8.1. Jetzt möchte ich das Limit für Open-Socket-Verbindungen auf beispielsweise 10.000 gleichzeitige Clients erhöhen. Beim Durchführen von DB-Benchmarks werden die pgbenchDienstprogramme bei etwa 950 gleichzeitigen Clients blockiert, was wie in guten alten Zeiten ein Limit von 1024 offenen FDS zu erreichen scheint. Ich habe den fs.file-maxKernel-Parameter und das pgbenchRessourcenlimit des laufenden Benutzers überprüft :

# sysctl fs.file-max
fs.file-max = 6598264
# su - postgres
$ ulimit -Sn
65536
$ fgrep files /proc/self/limits
Max open files            65536                65536                files
$ 

Die Grenzwerte von proczeigen jedoch, dass das Soft-Limit für maximal geöffnete Dateien für pgBouncer (als Benutzer ausgeführt postgres) nur maximal 1024 geöffnete Dateien beträgt:

$ ps -e | fgrep pgbouncer
 9840 ?        00:00:00 pgbouncer
$ fgrep files /proc/9840/limits
Limit                     Soft Limit           Hard Limit           Units
Max open files            1024                 4096                 files
$

Ich habe versucht , die Grenze durch das Einfügen zu erhöhen ulimit -S -n 5000in /etc/default/pgbouncer(lesen Sie in der Start / Stopp - Skript in /etc/init.d), aber das hat nicht funktioniert. Dann habe ich versucht nofile, mich einzurichten /etc/security/limits.confund sichergestellt, dass es in PAM aktiviert ist, aber ohne Erfolg.

Wo genau wird start-stop-daemondas nofileLimit für Daemon-Prozesse gesenkt? Ich bin über diesen alten Fehlerbericht für Debian gestolpert , aber es scheint, dass der Patch nie angewendet wurde.

Übrigens: Ist es fs.file-maxwirklich der Ersatz der Kernelvariablen des früheren Systems nofiles(beachten Sie den Plural), wie in vielen Blog-Artikeln zum Thema Tuning vorgeschlagen? Ich wundere mich, dass es im fsParameterbereich ist. Auf meinem IRIX-System wird es rlimit_no_files_maxim Ressourcenbereich aufgerufen , was für mich viel sinnvoller ist, als es in den fsAbschnitt zu setzen.

Was mache ich hier falsch? Wo ist der richtige Ort, um diesen Parameter für Daemons in Debian 8.1 zu ändern?

Danke im Voraus,

Stefan

LBC
quelle

Antworten:

7

Sie können "ulimit" im Abschnitt "start" des pgbouncer-Init-Skripts verwenden:

/etc/init.d/pgbouncer:

    [... snip ...]
    case "$1" in
      start)
        # Check if we are still disabled in /etc/default/pgbouncer
        [ "${START:-}" = "0" ] && exit 0
        log_daemon_msg "Starting PgBouncer" $NAME
        test -d $PIDDIR || install -d -o postgres -g postgres -m 2775 $PIDDIR

        ### set whatever limits you want ###
        ulimit -n 20000

        $SSD --start --chuid $RUNASUSER --oknodo -- $OPTS 2> /dev/null
        log_end_msg $?
        ;;
    [... snip ...]

Wenn diese Zeile hinzugefügt wird, sollten nach einem Neustart Effekte auftreten:

Tun Sie dies, oder Sie werden angeschrien:

# systemctl daemon-reload

Dann:

# /etc/init.d/pgbouncer restart

AKTUALISIEREN:

Meine ursprüngliche Antwort, die zeigte, dass Sie dem Init-Skript "ulimit" hinzufügen können, funktioniert unter Debian 8. Obwohl Deb8 eine Systemd-Distribution ist, scheint die Standardinstallation von pgbouncer immer noch das Init-Skript zu verwenden.

Für Centos7, das pgbouncer vollständig mit systemd verwaltet, möchten Sie eine systemd.service-Datei verwenden.

Zunächst scheint es einen Fehler in der Standarddienstdatei für pgbouncer unter Centos7 zu geben, bei dem "Type = forked" "Type = simple" sein muss.

In der Datei pgbouncer.service können Sie auch ein "LimitNOFILE = ##" im Abschnitt [Service] hinzufügen ... also

/etc/systemd/system/pgbouncer.service

    ## good practice to include the default service file as it may change with future updates
    .include /lib/systemd/system/pgbouncer.service

    ## change the Type= per this bug
    ## http://www.postgresql.org/message-id/[email protected]
    Type=simple

    ## Add a service section and set the max number of open files
    [Service]
    LimitNOFILE=12345

Es kann sinnvoll sein, zu überprüfen, ob die maximale Anzahl geöffneter Dateien der Engpass ist. Sie können Ihre Protokolle im Wesentlichen auf Fehlermeldungen "zu viele geöffnete Dateien" überprüfen. In jedem Fall, in dem ich die maximal zulässige Anzahl geöffneter Dateien überschritten habe, hat sich der Prozess beschwert ...

/var/log/postgresql/pgbouncer.log

ERROR S: login failed: FATAL: could not open relation mapping file (...): Too many open files in system
ERROR S: login failed: FATAL: could not open file (...): Too many open files in system
ERROR S: login failed: FATAL: pipe() failed: Too many open files in system
WARNING sbuf_connect failed: Too many open files in system

/var/log/postgresql/postgresql-9.4-main.log

LOG:  out of file descriptors: Too many open files in system; release and retry
PANIC:  could not open file (...): Too many open files in system
LOG:  server process (...) was terminated by signal 6: Aborted
DETAIL:  Failed process was running: END;
LOG:  terminating any other active server processes

Wir müssen uns keine Gedanken über verfügbare FDs für pgbench machen, denn wenn sie nicht ausreichen, wird pgbench nicht ausgeführt:

$ ulimit -S -n 100
$ pgbench -h 192.168.122.69 -p 6432 -U postgres -d booktown -c 200 -t 10000
You need at least 202 open files but you are only allowed to use 100.
Use limit/ulimit to increase the limit before using pgbench.
Morgan
quelle
Hallo Morgan, vielen Dank. Der systemd-Diensteintrag für pgbouncer hat es geschafft. ulimit in der rc-datei funktioniert nicht. Ich habe dies bereits versucht, bevor ich gefragt habe, b / c Ich dachte auch, dass Debian 8.1 immer noch RC-Dateien für verwendet pgbouncer, aber es hat stracegezeigt, dass dies systemddie No-Dateien begrenzt, kurz bevor der Daemon ausgeführt wird. Vielleicht ist es in systemd fest codiert. Wie auch immer, jetzt funktioniert es und das Limit von 950 Dateien ist weg. Jetzt bricht pgbench mit 1025 Clients ab und eine Fehlermeldung (na ja): ulimit -H -nzeigt 65536, pgbench -c 1025 -C -T 60löst Fehler aus invalid number of clients: 1025.
LBC
Aber ich kann das Problem umgehen, indem ich mehrere pgbench-Instanzen starte, und pgbouncer akzeptiert jetzt viel mehr Verbindungen als nur 950. Ich teste auf einem frisch installierten Server, der nächste Woche in die Produktion gehen wird, und wollte nur sicherstellen, dass ich es bin Ich kann die Limits bei Bedarf erhöhen (hatte in den letzten 5 Jahren mehrere Abstürze auf drei älteren Plattformen mit den Standardeinstellungen von postgresql / apache2 / php5-Konfigurationen, daher möchte ich auf unserem neuen Server nur auf diese Situation vorbereitet sein). Nochmals vielen Dank für Ihre Zeit und Hilfe! Sehr geschätzt.
LBC
Sollte gelesen haben pgbench -c 1025 -C -T 60 -p 6432 pgbench, wirft aber den gleichen Fehler. Es ist wahrscheinlich auch in pgbench fest codiert. : - /
LBC
Ich bin verwirrt, also löst das Hinzufügen von ulimit -n 20000 zum init.d-Skript das Problem mit Debian 8?
Arya
0

Sie können eine ulimit -n 20000Datei hinzufügen /etc/default/pgbouncer, um das Soft-Limit zu erhöhen.

echo "ulimit -n 20000" >> /etc/default/pgbouncer
systemctl restart pgbouncer

Dies gilt für Debian-10 (Buster) und PgBouncer 1.12.0

Sahap Asci
quelle