thiết lập ulimit trên một quy trình đang chạy


25

Tôi đã khởi chạy một ứng dụng máy chủ và tôi muốn chạy nó trong một thời gian dài cho mục đích thử nghiệm. Thật không may, tôi đã quên cài đặt trước ulimit -c unlimitedđể gặp sự cố cuối cùng và kiểm tra nó. Có điều gì tôi có thể làm?

Câu trả lời:


39

Trên các phiên bản gần đây của Linux (kể từ 2.6.36), bạn có thể sử dụng prlimitlệnh và lệnh gọi hệ thống để đặt giới hạn tài nguyên trên một quy trình tùy ý (được cấp quyền phù hợp):

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

Bạn cần có-linux-2.21 cho lệnh prlimit, nhưng bạn sẽ có thể kết hợp một chương trình nhanh để gọi lệnh gọi hệ thống prlimit theo cách khác:

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

Nếu bạn không có phiên bản Linux mới (hoặc HĐH khác), cách khắc phục duy nhất tôi biết là kết nối với quy trình gdbvà vấn đề setrlimittừ trình gỡ lỗi:

$ 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

Đây là để thiết lập ulimit -m, RLIMIT_AS = 9; chính xác áp dụng tương tự cho ulimit -c( RLIMIT_CORE, giá trị số 4trên Linux trên x86-64). Đối với "không giới hạn" RLIM_INFINITY, thường sử dụng -1. Bạn nên kiểm tra /usr/include/bits/types.hkích thước của rlim_tnó là gì; Tôi giả sử long long(nó thực sự không được ký, nhưng sử dụng loại đã ký giúp "không giới hạn" -1 dễ đọc hơn).


+1 gdbKỹ thuật này thực sự rất tuyệt. Một cảnh báo, có vẻ như bạn không thể tăng số lượng tệp đang mở cho một quá trình không root vượt quá giới hạn cứng của nó, setrlimitcuộc gọi trả về -1 và errno là 22 (đối số không hợp lệ).
Steve Kehlet

2

Vì Ubuntu 14.04 Trusty không có tiện ích-linux-2.21 (là 2.20), nên không có prlimitlệnh CLI để sử dụng.

Sử dụng Python3.4 + (có sẵn trên Ubuntu 14.04 và tất cả các phiên bản mới hơn) có thể đặt giới hạn tài nguyên cho một quy trình đang chạy. Chạy bằng root:

1-lót:

# 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   

Hoặc dài dòng hơn:

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

Xác nhận nó hoạt động:

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

Lưu ý điều này hoạt động với Linux 2.6.36 trở lên với glibc 2.13 trở lên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.