Problem mit Too many open files

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
tbrandt
Beiträge: 6
Registriert: 02.11.2012 11:58:48

Problem mit Too many open files

Beitrag von tbrandt » 16.09.2016 10:34:57

Hallo erstmal,

hier die Grunddaten zu meinem System:

Code: Alles auswählen

Distributor ID: Debian
Description:    Debian GNU/Linux 7.11 (wheezy)
Release:        7.11
Codename:       wheezy
Filesystem         Size  Used Avail Use% Mounted on
/dev/ploop20076p1  985G  561G  375G  60% /
             total       used       free     shared    buffers     cached
Mem:         12288       3243       9044          0          0       1421
-/+ buffers/cache:       1822      10465
Swap:


Nun zu meinem Problem:

Ich betreibe dieses System als meinen Hauptserver für Web und eMail.
Es laufen ca. 30 Domains mit ca. 100 eMailkonten auf dem Server + einige Webseiten.
Bisher lief die Kiste seit Jahren problemlos.
Gestern Abend konnte ich allerdings keine eMails mehr abrufen/verschicken, was mich etwas stutzig mache.
Nach kurzer Recherce über das iPhone auf dem System stelle ich fest, dass der bind9-Dienst dieses Mal nicht der Fehler war.
Stattdessen tauchten in der Konsole immer folgende Meldunden auf (bzw. auch im syslog):

Code: Alles auswählen

ep 16 09:49:11 server2 apache2: libnss-mysql: Connection to server '127.0.0.1' failed: Can't connect to MySQL server on '127.0.0.1' (111)
Nach einigen Blicken in die Logfiles sah ich, dass im /var/log/auth.log folgendes zu finden war:

Code: Alles auswählen

Sep 16 10:04:21 server2 mysqld[2814]: warning: cannot open /etc/hosts.allow: Too many open files
Sep 16 10:04:21 server2 mysqld[2814]: warning: cannot open /etc/hosts.deny: Too many open files
Sep 16 10:04:21 server2 mysqld[2814]: refused connect from 127.0.0.1

Trotz vielfacher Recherche im Netz konnte ich die Limits nicht anpassen.

Meine /etc/security/limits.conf hat u.a. folgende Werte:

Code: Alles auswählen

*         hard    nofile      900000
*         soft    nofile      900000
root      hard    nofile      900000
root      soft    nofile      900000
In der /etc/sysctl.conf ist folgendes angegeben:

Code: Alles auswählen

fs.file-max = 2097152
Leider haben die Anpassungen nichts gebracht.
Mittlerweile läuft der Server nach einem Reboot wieder.

Wie genau kann ich diese Werte erhöhen`?
Ein ulimit -Hn bringt folgendes Ergebnis:

Code: Alles auswählen

root@server2:/var/log# ulimit -Hn
4096

Ich arbeite schon wirklich lange mit Linux, besonders Debian und setze es auch im Beruf sehr häufig ein.
Aber DAS ist mir echt noch nie passiert...

Ich könnte mir vorstellen, dass es damit zusammen hängt, dass ich vor einigen Monaten aus Performancegründen die Datenbanken auf "file-per-table" (MySQL) umgestellt habe und bei einem Check eben recht viele Datenbanken bzw. Dateien der Datenbanken im Zugriff waren.
Aber ich kann ja nicht ständig Datenbanken löschen, nur damit ich das max_open_files_limit nicht erreiche :(.

Danke für eure Hilfe,
ein etwas ratloser Timo :THX:

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Problem mit Too many open files

Beitrag von eggy » 16.09.2016 11:19:03

Muss nicht der Fall sein, dass das was in der /etc/sysctl.conf steht auch aktuell gilt, schau lieber was aktuell gesetzt ist (cat /proc/sys/fs/file-max), evtl wurde der Wert durch irgendwas überschrieben.

tbrandt
Beiträge: 6
Registriert: 02.11.2012 11:58:48

Re: Problem mit Too many open files

Beitrag von tbrandt » 16.09.2016 11:36:10

Da bekomme ich das hier:

Code: Alles auswählen

root@server2:~# cat /proc/sys/fs/file-max
524288
Allerdings habe ich in der /etc/sysctl.conf ja folgendes eingetragen:

Code: Alles auswählen

fs.file-max = 2097152
Leider komme ich mit sysctl -p zum übernehmen / überschreiben nicht weiter...

Code: Alles auswählen

root@server2:/var/log# sysctl -p
sysctl: permission denied on key 'fs.file-max'
Alles sehr merkwürdig.
Hab in den letzten Wochen keine Datebank angelegt und trotzdem macht er nun so ein Spektakel...

Mozie
Beiträge: 31
Registriert: 20.05.2015 13:09:39

Re: Problem mit Too many open files

Beitrag von Mozie » 16.09.2016 12:15:55

Prüf doch mal das Limit von dem Mysql-Prozess direkt!

cat /proc/PID/limit

MFG Michael

tbrandt
Beiträge: 6
Registriert: 02.11.2012 11:58:48

Re: Problem mit Too many open files

Beitrag von tbrandt » 16.09.2016 13:10:05

Aha, das erklärt ja schonmal einiges...

Code: Alles auswählen

root@server2:/proc# cat /proc/6667/limits
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            10485760             unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             1547027              1547027              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       1547027              1547027              signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
Wie kann ich die denn ändern? :lol: :roll:

Benutzeravatar
MSfree
Beiträge: 10752
Registriert: 25.09.2007 19:59:30

Re: Problem mit Too many open files

Beitrag von MSfree » 16.09.2016 13:21:38

tbrandt hat geschrieben:Wie kann ich die denn ändern? :lol: :roll:
Da du noch wheezy verwendest, kannst du in das Startscript von mysql, vermutlich /etc/init.d/mysql, eine Zeile Einfügen, mit der du das Limit erhöhst:

Code: Alles auswählen

ulimit -n 4096
Bei mir hat das mal bei einem Samba-Server geholfen, der auch ständig über zu viele offene Dateien geklagt hat.

tbrandt
Beiträge: 6
Registriert: 02.11.2012 11:58:48

Re: Problem mit Too many open files

Beitrag von tbrandt » 16.09.2016 13:37:10

Kannst Du mir sagen, an welcher Stelle ich das einfügen muss?
Will das Script jetzt nicht zerschießen :D

Mozie
Beiträge: 31
Registriert: 20.05.2015 13:09:39

Re: Problem mit Too many open files

Beitrag von Mozie » 16.09.2016 13:59:42

Wie kann man ein Script ändern, ohne es zu zerschießen?
Indem man einfach ein Backup macht.
mv /etc/init.d/mysql /etc/init.d/mysql.old
Und dann füge es einfach in die Switch-Case-abfrage beim Start ein.

MFG

tbrandt
Beiträge: 6
Registriert: 02.11.2012 11:58:48

Re: Problem mit Too many open files

Beitrag von tbrandt » 16.09.2016 14:12:30

Meine Frage bezog sich eher darauf, an welche Stelle.
Normalerweise folgen solche Scripte doch einer gewissen Logik. Da will ich nich einfach irgendwas irgendwo hin kopieren...

So sieht jetzt der teil aus, in dem die Zeile ist:

Code: Alles auswählen

## Do some sanity checks before even trying to start mysqld.
sanity_checks() {
  # check for config file
  if [ ! -r /etc/mysql/my.cnf ]; then
    log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
    echo                "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
  fi

  # check for diskspace shortage
  datadir=`mysqld_get_param datadir`
  if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then
    log_failure_msg "$0: ERROR: The partition with $datadir is too full!"
    echo                "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
    exit 1
  fi
}

## Checks if there is a server running and if so if it is accessible.
#
# check_alive insists on a pingable server
# check_dead also fails if there is a lost mysqld in the process list
#
# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
mysqld_status () {
    ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))

    ps_alive=0
    pidfile=`mysqld_get_param pid-file`
    if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi

    if [ "$1" = "check_alive"  -a  $ping_alive = 1 ] ||
       [ "$1" = "check_dead"   -a  $ping_alive = 0  -a  $ps_alive = 0 ]; then
        return 0 # EXIT_SUCCESS
    else
        if [ "$2" = "warn" ]; then
            echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
        fi
        return 1 # EXIT_FAILURE
    fi
}

#
# main()
#

case "${1:-''}" in
  'start')
        sanity_checks;
        # Start daemon
        log_daemon_msg "Starting MySQL database server" "mysqld"
        if mysqld_status check_alive nowarn; then
           log_progress_msg "already running"
           log_end_msg 0
           [b]ulimit -n 10000[/b]
Ist das richtig? Hab den mysql-daemon neu gestartet - wert ist immer noch nicht 10000

Code: Alles auswählen

root@server2:/proc# cat /proc/21306/limits
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            10485760             unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             1547027              1547027              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       1547027              1547027              signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
root@server2:/proc#

Mozie
Beiträge: 31
Registriert: 20.05.2015 13:09:39

Re: Problem mit Too many open files

Beitrag von Mozie » 16.09.2016 14:37:33

Hi,
habe es gerade mal probiert.
Schreib es einfach direkt nach #!/bin/bash
so funktioniert es bei mir.

MFG

ThomasChr
Beiträge: 9
Registriert: 09.09.2016 11:10:49
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Problem mit Too many open files

Beitrag von ThomasChr » 16.09.2016 14:38:11

Machs mal so:

Code: Alles auswählen

case "${1:-''}" in
  'start')
        sanity_checks;
        # Start daemon
        log_daemon_msg "Starting MySQL database server" "mysqld"
        ulimit -n 10000
        if mysqld_status check_alive nowarn; then
           log_progress_msg "already running"
           log_end_msg 0
Deine letzte Angabe hatte:
1. drumrum, und
2. war sie nur in dem Teil der aufgerufen wird wenn Mysql schon läuft

Gehts jetzt?

tbrandt
Beiträge: 6
Registriert: 02.11.2012 11:58:48

Re: Problem mit Too many open files

Beitrag von tbrandt » 16.09.2016 14:56:12

Sieht auf jeden Fall besser aus...
Hoffe, dass jetzt erstmal Ruhe ist. Tausen Dank für Eure / Deine Hilfe!!! :) :hail:

Code: Alles auswählen

root@server2:/proc# cat /proc/23497/limits
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            10485760             unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             1547027              1547027              processes
Max open files            10000                10000                files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       1547027              1547027              signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

.

Antworten