L'errore 11 del sistema operativo è "Risorsa temporaneamente non disponibile". La causa più comune per la ricezione di questo errore quando si tenta di creare un nuovo thread è il fatto che il kernel del processo ha imposto un limite ai descrittori di file aperti. La seconda causa più comune è il raggiungimento del limite imposto dal kernel del processo sul numero di processi/thread.
Ecco i fattori coinvolti:
- I limiti a livello di sistema:sysctl -e fs.file-max &&sysctl -e kernel.threads-max
- I limiti per processo (in una *nuova* shell):ulimit -n, grep nofile /etc/security/limits.conf e ulimit -u, grep nproc /etc/security/limits.conf.
- L'impostazione open_files_limit in mysqld (mysql> mostra variabili globali come "open_files_limit";).
- Le altre impostazioni all'interno di mysqld che possono influenzare il numero di FD aperti e thread che il processo può utilizzare (max_connections, thread_cache_size, table_open_cache, table_definition_cache, innodb_open_files, ecc.)
Supponendo che sia stato effettivamente raggiunto il limite di file aperti, che per impostazione predefinita è 1024 sulla maggior parte dei sistemi Linux, dovremmo essere in grado di evitare il problema seguendo questi passaggi:
1. Aumentare il limite di file aperti espliciti in mysqld apportando questa modifica al file my.cnf:
[mysqld] # Here X could be (max_connections+table_cache)*3 OR you could simply set it very high, for example 32000 open-files-limit = X
2. Riavvia il servizio MySQL:
/etc/init.d/mysql restart
Limiti NPROC
Se invece sembra che la causa sia il limite nproc (CentOS 6 pone un limite basso in /etc/security/limits.conf), allora possiamo aumentare il limite nproc in diversi modi.
1. Modifica limit.conf:
Possiamo impostare i limiti per l'utente mysql nel file limit.conf, ad esempio:
mysql soft nproc 10240 mysql hard nproc 40960
Si noti che limit.conf si applica solo alle shell di accesso e non influisce sui processi avviati da init o systemd. Qualsiasi modifica a limit.conf si applicherà solo ai nuovi accessi, devi disconnetterti e accedere per iniziare una nuova sessione.
2. Modifica lo script mysqld_safe:
Possiamo anche semplicemente aggiungere una chiamata ulimit nella parte superiore dello script mysqld_safe, ad esempio:
$ ulimit -u 40000
3. Usa uno script wrapper:
Fare riferimento al post di seguito su "Come utilizzare uno script wrapper per impostare attributi per processo personalizzati per server MySQL".
Come utilizzare uno script wrapper per impostare attributi per processo personalizzati per MySQL ServerDovremo riavviare mysqld affinché le modifiche abbiano effetto.