pengaturan ulimit pada proses yang sedang berjalan

25

Saya meluncurkan aplikasi server dan saya ingin menjalankannya untuk waktu yang lama untuk tujuan pengujian. Sayangnya, saya lupa mengatur sebelumnya ulimit -c unlimiteduntuk menangkap crash akhirnya dan memeriksanya. Adakah yang bisa saya lakukan?

Lorenzo Pistone
sumber

Jawaban:

39

Pada versi Linux terbaru (sejak 2.6.36), Anda dapat menggunakan prlimitperintah dan panggilan sistem untuk menetapkan batas sumber daya pada proses arbitrer (diberikan izin yang sesuai):

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

Anda memerlukan util-linux-2.21 untuk perintah prlimit, tetapi Anda harus dapat menyatukan program cepat untuk memanggil panggilan sistem prlimit jika tidak:

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

Jika Anda tidak memiliki versi Linux yang cukup baru (atau OS lain) satu-satunya perbaikan yang saya ketahui adalah terhubung ke proses dengan gdb dan mengeluarkan setrlimitdari 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

Ini adalah untuk pengaturan ulimit -m, RLIMIT_AS = 9; persis sama berlaku untuk ulimit -c( RLIMIT_CORE, nilai numerik 4di Linux pada x86-64). Untuk "tidak terbatas", gunakan RLIM_INFINITY, biasanya -1. Anda harus memeriksa /usr/include/bits/types.hapa ukurannya rlim_t; Saya berasumsi long long(sebenarnya tidak ditandatangani, tetapi menggunakan tipe yang ditandatangani membuat "tak terbatas" -1 lebih mudah dibaca).

ecatmur
sumber
+1 gdbTekniknya sangat keren. Satu peringatan, tampaknya Anda tidak dapat meningkatkan jumlah file yang terbuka untuk proses non-root melewati batas kerasnya, setrlimitpanggilan mengembalikan -1, dan errno adalah 22 (argumen tidak valid).
Steve Kehlet
2

Karena Ubuntu 14.04 Trusty tidak memiliki util-linux-2.21 (ini adalah 2.20), tidak ada prlimitperintah CLI untuk digunakan.

Menggunakan Python3.4 + (yang tersedia di Ubuntu 14.04 dan semua versi yang lebih baru) dapat menetapkan batas sumber daya untuk proses yang sedang berjalan. Jalankan sebagai 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   

Atau lebih verbose:

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

Verifikasi itu berfungsi:

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

Perhatikan ini bekerja dengan Linux 2.6.36 atau lebih baru dengan glibc 2.13 atau lebih baru.

HVNMencintai
sumber