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?

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


+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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.