impostare ulimit su un processo in esecuzione


25

Ho lanciato un'applicazione server e voglio eseguirla a lungo a scopo di test. Purtroppo, ho dimenticato di impostare prima ulimit -c unlimiteddi prendere un eventuale incidente e ispezionarlo. C'è qualcosa che posso fare?

Risposte:


39

Nelle versioni recenti di Linux (dalla 2.6.36), è possibile utilizzare il prlimitcomando e la chiamata di sistema per impostare i limiti delle risorse su un processo arbitrario (con le autorizzazioni appropriate):

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

Hai bisogno di util-linux-2.21 per il comando prlimit, ma dovresti essere in grado di mettere insieme un programma rapido per invocare la chiamata di sistema prlimit altrimenti:

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

Se non disponi di una versione abbastanza nuova di Linux (o di un altro sistema operativo), l'unica soluzione di cui sono a conoscenza è quella di collegarmi al processo con gdbed emettere setrlimitdal debugger:

$ 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

Questo è per impostazione ulimit -m, RLIMIT_AS = 9; lo stesso vale per ulimit -c( RLIMIT_CORE, valore numerico 4su Linux su x86-64). Per "illimitato", utilizzare RLIM_INFINITY, di solito -1. È necessario verificare in /usr/include/bits/types.hquale dimensione rlim_tè; Sto assumendo long long(in realtà è senza segno, ma l'uso di un tipo con segno rende "illimitato" -1 più facile da leggere).


+1 La gdbtecnica è davvero fantastica. Un avvertimento, sembra che non sia possibile aumentare il numero di file aperti per un processo non root oltre il limite massimo, la setrlimitchiamata restituisce -1 e errno è 22 (argomento non valido).
Steve Kehlet,

2

Poiché Ubuntu 14.04 Trusty non ha util-linux-2.21 (è 2.20), non c'è alcun prlimitcomando CLI da usare.

L'uso di Python3.4 + (che è disponibile su Ubuntu 14.04 e tutte le versioni successive) può impostare il limite di risorse per un processo in esecuzione. Esegui come 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 più prolisso:

# 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)

Verifica che funzioni:

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

Nota che funziona con Linux 2.6.36 o successivo con glibc 2.13 o successivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.