El sistema operativo Linux, por defecto, impone ciertas restricciones en el uso de recursos del sistema para garantizar la estabilidad. Estas limitaciones pueden ser ajustadas mediante la configuración del archivo /etc/security/limits.conf. Modificar estas configuraciones generalmente solo es necesario en escenarios específicos o cuando se tiene un conocimiento profundo de los parámetros.
Es importante notar que existe otra forma de ajustar el límite máximo de descriptores de archivo abiertos a través del sistema de archivos procfs, accesible mediante cat /proc/sys/fs/file-max.
El archivo limits.conf permite definir límites para el consumo de recursos por parte de los usuarios. La sintaxis de cada línea es la siguiente:
<dominio> <tipo> <elemento> <valor>
Donde:
<dominio>puede ser:- Un nombre de usuario específico.
- Un nombre de grupo, precedido por
@(ej.@developers). - El carácter comodín
*para establecer valores predeterminados aplicables a todos los usuarios (excepto root). - El carácter comodín
%para el límitemaxlogins. <tipo>puede ser:soft: Límite blando. Es el límite que el sistema aplica inicialmente. Puede ser incrementado por el usuario hasta el valor del límite duro.hard: Límite duro. Es el límite máximo absoluto que no puede ser superado, ni siquiera incrementado por el usuario.<elemento>define el recurso a limitar, incluyendo:core: Tamaño máximo del archivo core (en KB).data: Tamaño máximo del segmento de datos (en KB).fsize: Tamaño máximo de archivo (en KB).memlock: Espacio máximo de memoria bloqueada (en KB).nofile: Número máximo de descriptores de archivo abiertos.rss: Tamaño máximo del conjunto residente (memoria física) (en KB).stack: Tamaño máximo de la pila por hilo (en KB).cpu: Tiempo máximo de CPU en minutos.nproc: Número máximo de procesos por usuario.as: Límite del espacio de direcciones.maxlogins: Número máximo de inicios de sesión simultáneos para un usuario.maxsyslogins: Número máximo de inicios de sesión simultáneos en todo el sistema.priority: Prioridad de ejecución de los procesos del usuario.locks: Número máximo de bloqueos de archivo que un usuario puede mantener.sigpending: Número máximo de señales pendientes.msgqueue: Memoria máxima utilizada por colas de mensajes POSIX (en bytes).nice: Valor máximo de "niceness" permitido para incrementar la prioridad.rtprio: Prioridad máxima en tiempo real.
A continuación, se presenta un ejemplo de configuración:
root soft nofile 200000
root hard nofile 200000
admin hard nofile 65536
admin soft nofile 65536
Un caso común donde se requiere ajustar estos límites es al encontrar el error "too many open files" al ejecutar servicios como MySQL. En tales situaciones, se puede incrementar el valer de nofile para el usuario que ejecuta el proceso (mysqld en el caso de MySQL).
Es importante comprender la distinción entre límites soft y hard. El límite hard representa el techo absoluto, mientras que el soft es un límite inicial que puede ser elevado por el proceso hasta alcanzar el hard. Una configuración razonable podría ser:
mysql soft nofile 50000
mysql hard nofile 51200
Los cambios en limits.conf suelen requerir un nuevo inicio de sesión para que surtan efecto.
Para verificar los límites de recursos actuales de un usuario, se puede utilizar el comando ulimit -a.
Adicionalmente, el archivo /etc/security/limits.d/90-nproc.conf puede contener configuraciones relacionadas con el número máximo de procesos (nproc). Algunas distribuciones de Linux, como CentOS 5 y 6, utilizan sintaxis específicas para añadir estas configuraciones:
# Para CentOS 5
echo '* hard nproc 65535' >>/etc/security/limits.conf
echo '* hard nofile 65535' >>/etc/security/limits.conf
# Para CentOS 6
echo '* hard nproc 65535' >>/etc/security/limits.d/90-nproc.conf
Es relevante mencionar que el usuario root a menudo está exento de la limitación nproc impuesta por limits.conf.
En el contexto de servidores web como Nginx, la directiva worker_rlimit_nofile dentro del archivo de configuración de Nginx (nginx.conf) también controla el número de descriptores de archivo que los procesos de Nginx pueden abrir:
events
{
worker_rlimit_nofile 51200;
worker_connections 6000;
}