El error 11 del sistema operativo es "Recurso temporalmente no disponible". La causa más común de recibir este error al intentar crear un nuevo hilo es haber golpeado el kernel del proceso que impuso un límite en los descriptores de archivos abiertos. La segunda causa más común es haber alcanzado el límite impuesto por el núcleo del proceso en la cantidad de procesos/subprocesos.
Estos son los factores involucrados:
- Los límites de todo el sistema:sysctl -e fs.file-max &&sysctl -e kernel.threads-max
- Los límites por proceso (en un *nuevo* shell):ulimit -n, grep nofile /etc/security/limits.conf y ulimit -u, grep nproc /etc/security/limits.conf.
- La configuración open_files_limit en mysqld (mysql> muestra variables globales como "open_files_limit";).
- Las otras configuraciones dentro de mysqld que pueden afectar la cantidad de FD abiertos y subprocesos que el proceso puede usar (max_connections, thread_cache_size, table_open_cache, table_definition_cache, innodb_open_files, etc.)
Suponiendo que de hecho alcanzamos el límite de archivos abiertos, que por defecto es 1024 en la mayoría de los sistemas Linux, deberíamos poder evitar el problema siguiendo estos pasos:
1. Aumentar el límite explícito de archivos abiertos en mysqld haciendo este cambio en el archivo 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. Reinicie el servicio mysqld:
/etc/init.d/mysql restart
Límites de NPROC
Si, en cambio, parece que el límite de nproc es la causa (CentOS 6 pone un límite bajo en /etc/security/limits.conf), entonces podemos aumentar el límite de nproc de diferentes maneras.
1. Editar límites.conf:
Podemos establecer los límites para el usuario mysql en el archivo limits.conf, por ejemplo:
mysql soft nproc 10240 mysql hard nproc 40960
Tenga en cuenta que limites.conf solo se aplica a los shells de inicio de sesión y no afecta los procesos iniciados por init o systemd. Cualquier cambio en los límites.conf solo se aplicará a los nuevos inicios de sesión, debe cerrar sesión e iniciar sesión para iniciar una nueva sesión.
2. Edite el script mysqld_safe:
También podemos simplemente agregar una llamada ulimit cerca de la parte superior del script mysqld_safe, por ejemplo:
$ ulimit -u 40000
3. Use una secuencia de comandos contenedora:
Consulte la publicación a continuación sobre "Cómo usar un script de contenedor para establecer atributos personalizados por proceso para el servidor MySQL".
Cómo utilizar un script de envoltorio para establecer atributos personalizados por proceso para el servidor MySQLTendremos que reiniciar mysqld para que los cambios surtan efecto.