FreeBSD: "Troppi file aperti" ma dovrebbe essere in grado di aprire altri 160.000 file


11

Ho un sistema FreeBSD 8 che esegue ZFS, con un server MySQL 5.5 che è di circa 355 GB e dovrebbe diventare un paio di Terabyte.

MySQL sta attivando errori relativi a "Troppi file aperti" su /etc/hosts.allow. Non usiamo espressamente /etc/hosts.allow, ma viene utilizzato da hosts_access (3) ( libwrap.a), che viene utilizzato da molte cose.

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

Ma quando controllo, sembra che non stia colpendo alcun limite reale. Il numero di file aperti riportato da kern.openfiles staysmeno di 40.000 in un periodo prolungato e il nostro limite è sostanzialmente più elevato:

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

# ulimit -n
184320

Openfile dovrebbe essere impostato su illimitato:

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

MySQL afferma che dovrebbe essere in grado di aprire handle di file 184320:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

E alcune informazioni dal punto di vista dell'utente MySQL. Ho smesso di mysql e hackerato /usr/local/etc/rc.d/mysql-serverper stampare queste variabili, quindi questo dovrebbe rappresentare l'ambiente MySQL. Si noti che il numero 184320 è coerente con quanto sopra.

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

E, per un facile riferimento, ecco le descrizioni dei sistemi:

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

Relazionato


4
ulimit non è globale, sei sicuro che sia lo stesso ulimit con cui è in esecuzione MySQL?
derobert

1
Quindi, posso vedere qual è il valore di ulimit per il demone MySQL e posso cambiare il valore di ulimit per il demone senza arrestarlo? So di poterlo impostare ulimitnello script di avvio o nell'ambiente shell, ma ciò richiederebbe l'interruzione del database.
Stefan Lasiewski,

1
Cerca in / proc, sotto la directory con il PID del tuo servizio mysql. Puoi cat limitsvedere con cosa sta funzionando mysql. Puoi anche cambiarli al volo (con i kernel più recenti): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(come root ovviamente)
lornix

1
@lornix: questo è FreeBSD. Non ho mai usato BSD da solo, ma non sono sicuro che FreeBSD supporti effettivamente / proc / * / limits.
Martin von Wittich,

1
/procnon è montato di default su FreeBSD, ma fallo tu stesso sudo mount -t procfs proc /proc, vedi procfs(5)per maggiori informazioni. Una volta /procmontato, guarda il /proc/$PID/rlimitfile
zygis,

Risposte:


1

Controlla /etc/login.conf e scopri a quale classe di accesso è assegnato il tuo utente mysql. Probabilmente è predefinito o demone. Se si desidera modificare i limiti per l'utente, creare una nuova classe, assegnare l'utente a quella classe, modificare i limiti per quella classe come desiderato e quindi eseguire "cap_mkdb /etc/login.conf"

Se non l'hai ancora letto, fai: http://www.freebsd.org/doc/handbook/users-limiting.htm

I processi avviati all'avvio del sistema da / etc / rc sono assegnati alla classe di login del demone .


0

Su alcuni SO i limiti sono impostati per evitare problemi di sicurezza all'utente normale, dovresti prendere in considerazione la lettura di whant in man limits.conf
Questo file definisce i limiti per processo come il numero massimo di thread o il numero massimo di file aperti. La limitazione dell'uso del volto potrebbe provenire da lì. /etc/security/limits.conf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.