FreeBSD: "Zu viele geöffnete Dateien", sollte aber weitere 160.000 Dateien öffnen können

11

Ich habe ein FreeBSD 8-System mit ZFS und einem MySQL 5.5-Server mit etwa 355 GB, der voraussichtlich auf einige Terabyte anwachsen wird.

MySQL löst Fehler bezüglich "Zu viele geöffnete Dateien" aus /etc/hosts.allow. Wir verwenden nicht ausdrücklich /etc/hosts.allow, aber es wird von hosts_access (3) ( libwrap.a) verwendet, das von vielen Dingen verwendet wird.

mysqld[1234]: warning: /etc/hosts.allow, line 15: cannot open /etc/hosts.allow: Too many open files

Aber wenn ich nachschaue, scheine ich keine tatsächlichen Grenzen zu erreichen. Die Anzahl der geöffneten Dateien wurde kern.openfiles staysüber einen längeren Zeitraum um weniger als 40.000 gemeldet , und unser Limit ist wesentlich höher:

# sysctl -a |grep files
kern.maxfiles: 204800
kern.maxfilesperproc: 184320
kern.openfiles: 38191

# ulimit -n
184320

Openfiles sollten auf unbegrenzt gesetzt werden:

# grep openfiles /etc/login.conf
    :openfiles=unlimited:\

MySQL sagt, es sollte in der Lage sein, 184320-Dateihandles zu öffnen:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

Und einige Informationen aus der Sicht des MySQL-Benutzers. Ich habe /usr/local/etc/rc.d/mysql-serverMySQL gestoppt und gehackt , um diese Variablen auszudrucken, daher sollte dies die MySQL-Umgebung darstellen. Beachten Sie, dass die Nummer 184320 mit der obigen übereinstimmt.

# /usr/local/etc/rc.d/mysql-server.stefantest start
Starting mysql.
cpu time               (seconds, -t)  unlimited
file size           (512-blocks, -f)  unlimited
data seg size           (kbytes, -d)  33554432
stack size              (kbytes, -s)  524288
core file size      (512-blocks, -c)  unlimited
max memory size         (kbytes, -m)  unlimited
locked memory           (kbytes, -l)  unlimited
max user processes              (-u)  5547
open files                      (-n)  184320
virtual mem size        (kbytes, -v)  unlimited
swap limit              (kbytes, -w)  unlimited
sbsize                   (bytes, -b)  unlimited
pseudo-terminals                (-p)  unlimited

Und zum einfachen Nachschlagen hier die Beschreibungen für die Systeme:

kern.maxfiles: Maximum number of files
kern.openfiles: System-wide number of open files
kern.maxfilesperproc: Maximum files allowed open per process

verbunden

Stefan Lasiewski
quelle
4
ulimit ist nicht global. Sind Sie sicher, dass dies das gleiche ulimit ist, mit dem MySQL ausgeführt wird?
Derobert
1
Kann ich also sehen, wie hoch der ulimit-Wert für den MySQL-Dämon ist, und kann ich den ulimit-Wert für den Dämon ändern, ohne den Dämon anzuhalten? Ich weiß, dass ich ulimitim Startskript oder in der Shell-Umgebung festlegen kann , aber dafür müsste ich die Datenbank unterbrechen.
Stefan Lasiewski
1
Suchen Sie in / proc unter dem Unterverzeichnis mit der PID Ihres MySQL-Dienstes. Sie können cat limitssehen, mit was MySQL läuft. Sie können sie auch im echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits
laufenden Betrieb
1
@lornix: das ist FreeBSD. Ich habe BSD selbst noch nie verwendet, bin mir aber nicht sicher, ob FreeBSD tatsächlich / proc / * / limit unterstützt.
Martin von Wittich
1
/procwird nicht standardmäßig unter FreeBSD gemountet, aber machen Sie es selbst mit sudo mount -t procfs proc /proc, siehe procfs(5)für weitere Informationen. Sobald Sie /procgemountet haben, schauen Sie sich /proc/$PID/rlimitDatei
Zygis

Antworten:

1

Überprüfen Sie /etc/login.conf und finden Sie heraus, welcher Anmeldeklasse Ihr MySQL-Benutzer zugewiesen ist. Es ist wahrscheinlich Standard oder Daemon. Wenn Sie die Grenzwerte für Ihren Benutzer ändern möchten, erstellen Sie eine neue Klasse, weisen Sie Ihren Benutzer dieser Klasse zu, ändern Sie die Grenzwerte für diese Klasse nach Ihren Wünschen und führen Sie dann "cap_mkdb /etc/login.conf" aus.

Wenn Sie dies noch nicht gelesen haben, gehen Sie wie folgt vor: http://www.freebsd.org/doc/handbook/users-limiting.htm

Prozesse, die beim Systemstart von / etc / rc gestartet wurden, werden der Daemon- Anmeldeklasse zugewiesen .

Mike Diehn
quelle
0

Unter einigen Betriebssystemen sind die Grenzwerte so festgelegt, dass Sicherheitsprobleme für normale Benutzer vermieden werden. Lesen Sie in der man limits.conf
Datei Diese Datei definiert die Grenzwerte pro Prozess wie die maximale Anzahl von Threads oder die maximale Anzahl von geöffneten Dateien. Das Gesicht zur Einschränkung der Verwendung könnte von dort kommen. /etc/security/limits.conf

Kiwy
quelle