ustawianie ulimit w uruchomionym procesie

25

Uruchomiłem aplikację serwera i chcę ją uruchomić przez długi czas w celu przetestowania. Niestety zapomniałem ustawić wcześniej, ulimit -c unlimitedaby złapać ewentualną awarię i ją sprawdzić. Czy mogę coś zrobić?

Lorenzo Pistone
źródło

Odpowiedzi:

39

W najnowszych wersjach systemu Linux (od wersji 2.6.36) można użyć prlimitpolecenia i wywołania systemowego, aby ustawić limity zasobów dla dowolnego procesu (o odpowiednich uprawnieniach):

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

Potrzebny jest plik util-linux-2.21 dla komendy prlimit, ale w przeciwnym razie powinieneś być w stanie stworzyć szybki program, aby wywołać wywołanie systemowe prlimit :

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

Jeśli nie masz wystarczająco nowej wersji Linuksa (lub innego systemu operacyjnego), jedyną znaną mi poprawką jest połączenie się z procesem gdbi wydanie setrlimitz debuggera:

$ 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

To jest dla ustawienia ulimit -m, RLIMIT_AS = 9; dokładnie to samo dotyczy ulimit -c( RLIMIT_COREwartość liczbowa 4w systemie Linux na x86-64). W przypadku „nieograniczonej” RLIM_INFINITYzwykle używaj -1. Powinieneś sprawdzić, /usr/include/bits/types.hjaki jest rozmiar rlim_t; Zakładam long long(jest właściwie niepodpisany, ale użycie podpisanego typu sprawia, że ​​„nieograniczony” -1 jest łatwiejszy do odczytania).

ecatmur
źródło
+1 gdbTechnika jest naprawdę fajna. Jedno zastrzeżenie, wydaje się, że nie można zwiększyć liczby otwartych plików dla procesu użytkownika innego niż root powyżej jego twardego limitu, setrlimitwywołanie zwraca -1, a errno wynosi 22 (niepoprawny argument).
Steve Kehlet
2

Ponieważ Ubuntu 14.04 Trusty nie ma util-linux-2.21 (jest to 2.20), nie ma prlimitkomendy CLI do użycia.

Za pomocą Python3.4 + (który jest dostępny w Ubuntu 14.04 i wszystkich późniejszych wersjach) można ustawić limit zasobów dla uruchomionego procesu. Uruchom jako root:

1-liniowy:

# 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   

Lub bardziej szczegółowe:

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

Sprawdź, czy to działa:

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

Uwaga: działa to w systemie Linux 2.6.36 lub nowszym z glibc 2.13 lub nowszym.

HVNSweeting
źródło