Đặt giới hạn tệp tối đa cho một quy trình đang chạy


27

Tôi có một quá trình chạy dài mà cuối cùng sẽ đạt đến giới hạn tệp mở tối đa. Tôi biết làm thế nào để thay đổi điều đó sau khi nó thất bại, nhưng có cách nào để thay đổi điều đó cho quá trình đang chạy, từ dòng lệnh không?

Câu trả lời:


28

Trên các nhân mới hơn (2.6.32+) trên CentOS / RHEL, bạn có thể thay đổi điều này trong thời gian chạy với / Proc / <pid> / giới hạn:

cd /proc/7671/
[root@host 7671]# cat limits  | grep nice
Max nice priority         0                    0                    
[root@host 7671]# echo -n "Max nice priority=5:6" > limits
[root@host 7671]# cat limits  | grep nice
Max nice priority         5                    6                    

Đó là quy tắc! Không có ý tưởng bạn có thể viết vào tập tin giới hạn.
clee

4
không hoạt động với tôi trên Ubuntu 12.04
Poma

5
Điều này không hoạt động trên kernel 3.2 của tôi . Tôi đoán bản phân phối của bạn có một bản vá không chính thức cụ thể cho việc này vì tôi không thấy dấu vết nào của bản vá này trong fs / Proc / base.c của kernel .
Totor

Có thể ... Tôi biết nó hiện diện trong hạt nhân RHEL / CentOS. Nó dường như không có trong các hạt nhân Debian.
Sig-IO

2
'setprlimit' là cách chứng minh và khuyến nghị trong tương lai, xem câu trả lời tiếp theo
Sig-IO

26

Như tài liệu ở đây , prlimitlệnh, được giới thiệu với produc-linux 2.21 cho phép bạn đọc và thay đổi giới hạn của các quy trình đang chạy.

Đây là phần tiếp theo của phần ghi /proc/<pid>/limits, không được tích hợp trong kernel dòng chính. Giải pháp này nên hoạt động.

Nếu bạn chưa có prlimit(1), bạn có thể tìm mã theo phiên bản tối giản trong prlimit(2)trang chủ .


2
+1 cho phiên bản tối giản trong trang chủ!
Totor 14/12/17

Cảnh báo: "memcached" sẽ segfault nếu bạn thay đổi "nolimit" trong quá trình xử lý sau khi nó gặp phải giới hạn. Không phải lúc nào cũng là một ý tưởng tốt để sử dụng các giới hạn có thể ghi
John


2

Bạn có thể thử ulimit man ulimitvới tùy chọn -n tuy nhiên trang mag không hầu hết các hệ điều hành không cho phép cài đặt này.

Bạn có thể đặt giới hạn mô tả tệp trên toàn hệ thống bằng cách sử dụng sysctl -w fs.file-max=Nvà thực hiện các thay đổi liên tục để khởi động trong/etc/sysctl.conf

Tuy nhiên tôi cũng đề nghị xem xét quá trình để xem liệu nó có thực sự cần phải mở quá nhiều tệp tại một thời điểm nhất định hay không và trên thực tế bạn có thể đóng một số tệp xuống và hiệu quả hơn trong quy trình.


Điều tập tin mở là một lỗi, nhưng tôi đã không thể tìm ra nó. Trong khi tôi muốn làm như vậy, sản xuất định kỳ gặp sự cố vào giữa ngày.
kāgii

ulimitkhông áp dụng cài đặt cho các quy trình đang chạy .
thử-bắt-cuối cùng

0

Quá trình có thể thay đổi các giới hạn mềm của chính nó nếu được lập trình để làm như vậy (hoặc nếu bạn quản lý để hack nó), nhưng nó không thể tăng giới hạn cứng trừ khi nó có khả năng CAP_SYS_RESOURCE. Bạn có thể kiểm tra các giới hạn tại thời gian chạy trong /proc/$pid/limits.

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.