Administrar servidores Unix puede ser un desafío, especialmente cuando los sistemas que usted administra son muy usados y los problemas de rendimiento reducen la disponibilidad. Afortunadamente, puede poner límites a ciertos recursos para ayudar a garantizar que los procesos más importantes de sus servidores puedan seguir funcionando y que los procesos en competencia no consuman más recursos de los que son buenos para el sistema en general. El comando ulimit puede mantener el desastre a raya, pero necesita anticipar dónde los límites tendrán sentido y dónde causarán problemas.
Puede que no ocurra muy a menudo, pero un solo usuario que inicie demasiados procesos puede hacer que un sistema sea inutilizable para todos los demás. Una bomba de bifurcación -un ataque de denegación de servicio en el que un proceso se replica continuamente hasta que se agotan los recursos disponibles- es el peor caso de esto. Sin embargo, incluso los usuarios amistosos pueden utilizar más recursos de los que son buenos para un sistema, a menudo sin pretenderlo. Al mismo tiempo, los procesos legítimos a veces pueden fallar cuando se ejecutan contra los límites que están diseñados para los usuarios promedio. En este caso, debe asegurarse de que estos procesos reciban asignaciones reforzadas de recursos del sistema que les permitan ejecutarse correctamente sin hacer que los mismos recursos estén disponibles para todos.
Para ver los límites asociados con su inicio de sesión, utilice el comando ulimit -a. Si está usando una cuenta de usuario normal, probablemente verá algo como esto:
$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 32767max locked memory (kbytes, -l) 32max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 50virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
Una cosa que podría notar de inmediato es que no puede crear volcados de núcleo – porque su tamaño máximo de archivo de núcleo es 0. Sí, eso significa nada, ningún dato, ningún volcado de núcleo. Si un proceso que se está ejecutando aborta, ningún archivo de núcleo se va a caer en su directorio de inicio. Mientras el tamaño del archivo del núcleo esté a cero, no se permite el volcado del núcleo. Esto tiene sentido para la mayoría de los usuarios, ya que probablemente no harían nada más con un volcado de núcleo que borrarlo, pero si necesita un volcado de núcleo para depurar los problemas que está teniendo con una aplicación, es posible que quiera establecer el tamaño de su archivo de núcleo como ilimitado — y tal vez pueda hacerlo.
$ ulimit -c ulimited$ ulimit -cunlimited
Si está administrando un servidor y quiere activar la capacidad de generar volcados de núcleo para todos sus usuarios — quizás sean desarrolladores que realmente necesitan poder analizar estos volcados de núcleo, tiene que cambiar el usuario a root y editar su /etc/security/limits.conf (Linux) o hacer cambios en su archivo /etc/system (Solaris).
Si, por otro lado, está administrando un servidor y no quiere que ninguno de sus usuarios pueda generar volcados de núcleo sin importar lo mucho que les gustaría hincarle el diente a uno, puede establecer un límite de 0 en su limits.conf.
Otro límite que a menudo se aplica es uno que limita el número de procesos que un individuo puede ejecutar. La opción ulimit utilizada para esto es -u. Usted puede ver su límite como lo hicimos anteriormente con el comando ulimit -a o mostrar sólo el límite «nproc» con el comando ulimit -u.
$ ulimit -u50
Una vez más, sus usuarios pueden cambiar sus límites con otro comando ulimit — ulimit -u 100 — a menos que, por supuesto, no puedan. Si los has limitado a 50 procesos en el archivo limits.conf o del sistema, obtendrán un error como este cuando intenten aumentar sus límites:
$ ulimit -u 100-bash: ulimit: max user processes: cannot modify limit: Operation not permitted
Los límites también pueden ser configurados por grupo para que puedas, digamos, dar a los desarrolladores la capacidad de ejecutar más procesos que los administradores. Líneas como estas en tu archivo limits.conf harían eso:
@managers hard nproc 50@developers hard nproc 200
Si quieres limitar el número de archivos abiertos, sólo tienes que usar una configuración diferente.
@managers hard nofile 2048@developers hard nofile 8192sbob hard nofile 8192
Aquí hemos dado a dos grupos y a un individuo aumentos en sus límites de archivos abiertos. Todos estos establecen límites duros. Si también establece límites suaves, los usuarios recibirán advertencias cuando alcancen el límite inferior.
@developers soft nofile 2048@developers hard nofile 8192
Para ver una lista de las opciones de ulimit, mire la página man (man ulimit). Notará que ulimit es un built-in de bash — al menos en Linux — y que las siguientes opciones están disponibles:
-a All current limits are reported-c The maximum size of core files created-d The maximum size of a process's data segment-e The maximum scheduling priority ("nice")-f The maximum size of files written by the shell and its children-i The maximum number of pending signals-l The maximum size that may be locked into memory-m The maximum resident set size (has no effect on Linux)-n The maximum number of open file descriptors (most systems do not allow this value to be set)-p The pipe size in 512-byte blocks (this may not be set)-q The maximum number of bytes in POSIX message queues-r The maximum real-time scheduling priority-s The maximum stack size-t The maximum amount of cpu time in seconds-u The maximum number of processes available to a single user-v The maximum amount of virtual memory available to the shell
Si su archivo limits.conf lo permite, podría ver límites como estos establecidos para aplicaciones particulares que realmente necesitan la capacidad extra. En este ejemplo, el usuario oracle tiene la capacidad de ejecutar hasta 16,384 procesos y abrir 65,536 archivos. Estas líneas se establecerían en el .bash_profile del usuario oracle.
if ; then if ; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi