2010-09-17 25 views
11

Có thể tăng thông số "Tệp mở tối đa" cho quy trình làm việc không? Ý tôi là tham số này:"Tệp mở tối đa" cho quy trình làm việc

cat /proc/<pid>/limits | grep files 

Cám ơn lời khuyên của bạn

+0

Thông tin bổ sung: quy trình của tôi là 'java'. Tôi cần tăng "tệp mở tối đa" mà không dừng quá trình. – wako

Trả lời

21

Là quản trị viên hệ thống: Tệp /etc/security/limits.conf kiểm soát điều này trên hầu hết các cài đặt Linux; nó cho phép bạn đặt giới hạn cho mỗi người dùng. Bạn sẽ muốn một dòng như myuser - nofile 1000.

Trong quá trình: The getrlimit and setrlimit calls kiểm soát hầu hết các giới hạn phân bổ tài nguyên theo quy trình. RLIMIT_NOFILE kiểm soát số lượng mô tả tệp tối đa. Bạn sẽ cần các quyền thích hợp để gọi nó.

+0

Có vẻ như đây là những gì tôi cần.Tôi có thể đặt "setrlimit (RLIMIT_NOFILE, ...)" cho một số quy trình bên ngoài không? – wako

+0

Tôi không biết gì cả. Nếu có, tôi nghi ngờ bạn sẽ tìm thấy nó chôn sâu trong một số hướng dẫn lập trình cụ thể cho Linux, bởi vì tôi không thể hiểu được nơi nào khác POSIX tiêu chuẩn sẽ đặt nó. –

+0

Đôi khi 'limits.conf' không được tính đến và bạn phải đặt' DefaultLimitNOFILE' trong '/ etc/systemd/system.conf' và' user.conf'. – Xdg

4

This link chi tiết làm thế nào để thay đổi hệ thống này rộng hoặc cho mỗi người dùng.

+0

Cảm ơn bạn đã liên kết. Nhưng tôi đã tìm thấy nó trước khi hỏi :-) Nhưng vấn đề là để thay đổi tham số mà không dừng quá trình (trên thời gian chạy) và cho toàn bộ quá trình. – wako

+0

@wako: Nó không thể được thực hiện từ bên ngoài quá trình (trừ khi bạn đang chạy một trong những hạt nhân phát triển mới nhất, không chắc) – caf

+0

@caf: Cảm ơn. Đây chính là điều tôi muốn nghe. – wako

6

Chủ đề cũ, tôi biết.

Bạn có thể sử dụng gdb, đột nhập vào quá trình, gọi các syscalls nói trên để tăng giới hạn bạn quan tâm, sau đó tiếp tục công việc và thoát khỏi gdb. Tôi đã chỉnh sửa mọi thứ một cách nhanh chóng bằng cách này một vài lần.

Ứng dụng của bạn sẽ không bị hỏng, nhưng chỉ bị đóng băng trong lúc bạn thực hiện cuộc gọi. nếu bạn nhanh chóng (hoặc bạn kịch bản nó!), nó có thể sẽ không được chú ý.

+0

Cảm ơn mẹo! –

+0

+1 Đề xuất tuyệt vời, [bài đăng này] (http://superuser.com/a/441758/81173) và [blog này] (http://gregchapple.com/updating-ulimit-on-running-linux-process /) mô tả cách thực hiện. –

+0

Vâng, điều này có phần giống như tinh chỉnh Ma trận để làm cho mọi thứ hoạt động ... ngăn chặn thế giới, chỉnh sửa biến, tiếp tục thế giới ... oh! DeJaVu! Tôi la sô một! (tốt, khi tôi có gdb!) – lornix

3

Có, có thể tăng giới hạn trong /proc/<pid>/limits khi chạy. Chỉ cần tìm pid và thực hiện dưới lệnh:

echo -n "Max open files=20:20" > /proc/$pid/limits 
+2

Không được hút trên Ubuntu 14.04.2 LTS. –

3
echo -n "Max open files=20:20" > /proc/$pid/limits 

... làm việc trong RHEL5.5 và RHEL6.7.

Lưu ý rằng "-n" là bắt buộc; một dòng mới sẽ tạo một khiếu nại về các đối số không hợp lệ.

12

Một tùy chọn khác là sử dụng lệnh prlimit (từ gói util-linux). Ví dụ, nếu bạn muốn thiết lập số lượng tối đa của tập tin đang mở cho một quá trình:

prlimit -n4096 -p pid_of_process

+0

hoặc debian, hoặc ubuntu, hoặc ... – t2d

+0

Tôi đang sử dụng Linux mint (dựa trên Ubuntu) và tôi không thể tìm thấy nó trong cài đặt mặc định. Thông thường nó là một phần của gói util-linux nhưng eve gói này trên Mint không mang lại lệnh này. – redobot

+0

➜ ~ lsb_release -d Mô tả: \t Ubuntu 16.04.1 LTS ➜ ~ whereis prlimit prlimit:/usr/bin/prlimit /usr/share/man/man2/prlimit.2.gz/usr/share/man/man1/prlimit.1.g – t2d

3

Các lệnh sau đây cung cấp cho tối đa # các tập tin mở cho mỗi quá trình cho phép theo mặc định giới hạn (mềm và cứng tương ứng):

ulimit -Sa 
ulimit -Ha 

Bạn có thể sử dụng chương trình hoặc lệnh để thay đổi các giới hạn này. Nhìn vào ulimit (người đàn ông ulimit).

Các vấn đề liên quan