FreeBSD: „Zbyt wiele otwartych plików”, ale powinno być w stanie otworzyć kolejne 160 000 plików

11

Mam system FreeBSD 8 z systemem ZFS, z serwerem MySQL 5.5, który ma około 355 GB i ma wynieść kilka terabajtów.

MySQL powoduje błędy dotyczące „Zbyt wielu otwartych plików” /etc/hosts.allow. Nie używamy tego wyraźnie /etc/hosts.allow, ale jest używany przez hosts_access (3) ( libwrap.a), który jest używany przez wiele rzeczy.

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

Ale kiedy sprawdzam, wydaje się, że osiągam jakieś rzeczywiste limity. Liczba otwartych plików zgłoszonych przez kern.openfiles staysmniej niż 40 000 w dłuższym okresie, a nasz limit jest znacznie wyższy:

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

# ulimit -n
184320

Pliki openfile powinny być ustawione na nieograniczoną liczbę:

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

MySQL mówi, że powinno być możliwe otwieranie uchwytów plików 184320:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

I niektóre informacje z perspektywy użytkownika MySQL. Zatrzymałem mysql i zhakowałem, /usr/local/etc/rc.d/mysql-serveraby wydrukować te zmienne, więc powinno to reprezentować środowisko MySQL. Zauważ, że liczba 184320 jest zgodna z powyższym.

# /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

I dla łatwego odniesienia tutaj są opisy sysctls:

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

Związane z

Stefan Lasiewski
źródło
4
ulimit nie jest globalny, czy jesteś pewien, że to ten sam ulimit, z którym działa MySQL?
derobert
1
Czy mogę zobaczyć, jaka jest wartość ulimit dla demona MySQL i czy mogę zmienić wartość ulimit dla demona bez zatrzymywania go? Wiem, że mogę ustawić ulimitw skrypcie startowym lub w środowisku powłoki, ale wymagałoby to przerwania bazy danych.
Stefan Lasiewski
1
Zajrzyj do / proc, w podkatalogu z PID twojej usługi mysql. Możesz cat limitszobaczyć, z czym działa mysql. Możesz także zmienić je w locie (z nowszymi jądrami): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(jako root oczywiście)
lornix
1
@lornix: to jest FreeBSD. Nigdy nie korzystałem z BSD, ale nie jestem pewien, czy FreeBSD faktycznie obsługuje / proc / * / limit.
Martin von Wittich,
1
/procnie jest domyślnie montowany na FreeBSD, ale zrób to sam sudo mount -t procfs proc /proc, zobacz procfs(5)więcej informacji. Po /proczamontowaniu spójrz na /proc/$PID/rlimitplik
zygis 17.09.13

Odpowiedzi:

1

Sprawdź /etc/login.conf i dowiedz się, do której klasy logowania przypisany jest Twój użytkownik mysql. Prawdopodobnie jest to domyślny lub demon. Jeśli chcesz zmienić limity dla użytkownika, utwórz nową klasę, przypisz użytkownika do tej klasy, zmień limity dla tej klasy, jak chcesz, a następnie uruchom „cap_mkdb /etc/login.conf”

Jeśli jeszcze tego nie przeczytałeś, wykonaj: http://www.freebsd.org/doc/handbook/users-limiting.htm

Procesy rozpoczęte podczas uruchamiania systemu przez / etc / rc są przypisane do klasy logowania demona .

Mike Diehn
źródło
0

W niektórych systemach operacyjnych limity są ustawione, aby uniknąć problemów z bezpieczeństwem dla zwykłego użytkownika, należy rozważyć przeczytanie whant w man limits.conf
tym pliku określa limity na proces, takie jak maksymalna liczba wątków lub maksymalna liczba otwartych plików. Stamtąd twarz ograniczenia może pochodzić. /etc/security/limits.conf

Kiwy
źródło