establecer ulimit en un proceso en ejecución

25

Lancé una aplicación de servidor y quiero ejecutarla durante mucho tiempo con fines de prueba. Desafortunadamente, olvidé configurar antes ulimit -c unlimitedpara detectar un posible bloqueo e inspeccionarlo. ¿Hay algo que pueda hacer?

Lorenzo Pistone
fuente

Respuestas:

39

En versiones recientes de Linux (desde 2.6.36), puede usar el prlimitcomando y la llamada al sistema para establecer límites de recursos en un proceso arbitrario (con los permisos apropiados):

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

Necesita util-linux-2.21 para el comando prlimit, pero debería poder armar un programa rápido para invocar la llamada al sistema prlimit de lo contrario:

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

Si no tiene una versión suficientemente nueva de Linux (u otro sistema operativo), la única solución que conozco es conectarse al proceso gdby emitir setrlimitdesde el depurador:

$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0

Esto es para el ajuste ulimit -m, RLIMIT_AS = 9; exactamente lo mismo se aplica para ulimit -c( RLIMIT_CORE, valor numérico 4en Linux en x86-64). Para "ilimitado", use RLIM_INFINITY, por lo general -1. Debe verificar /usr/include/bits/types.hcuál es el tamaño de rlim_t; Supongo long long(en realidad no está firmado, pero usar un tipo con signo hace que "ilimitado" -1 sea más fácil de leer).

ecatmur
fuente
+1 La gdbtécnica es realmente genial. Una advertencia, parece que no puede aumentar el número de archivos abiertos para un proceso no root más allá de su límite rígido, la setrlimitllamada devuelve -1 y errno es 22 (argumento no válido).
Steve Kehlet
2

Como Ubuntu 14.04 Trusty no tiene util-linux-2.21 (es 2.20), no hay un prlimitcomando CLI para usar.

El uso de Python3.4 + (que está disponible en Ubuntu 14.04 y todas las versiones posteriores) puede establecer el límite de recursos para un proceso en ejecución. Ejecutar como root:

1-liner:

# PID=966
# grep 'open file' /proc/$PID/limits
Max open files            1024                 4096                 files     
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files            2048                 12345                files   

O más detallado:

# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)

Verifique que funcione:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

Tenga en cuenta que esto funciona con Linux 2.6.36 o posterior con glibc 2.13 o posterior.

HVNSweeting
fuente