Quá nhiều tệp đang mở trên Debian


15

Tôi có quá trình chạy dài tại Debian. Tại một số điểm trong một lỗi:

Quá nhiều tệp mở.

Đang chạy:

ulimit -a

trình diễn:

mở tệp (-n) 1024

Tôi muốn tăng số lượng tệp mở trong 2 lần. Sau khi thực hiện

ulimit -n 2048

giới hạn được kích hoạt cho đến khi kết thúc phiên của tôi, không áp dụng cho nhiệm vụ.

Làm thế nào tôi có thể tăng vĩnh viễn số lượng tệp đang mở?

Câu trả lời:


12

Nếu quy trình của bạn được bắt đầu thông qua một tập lệnh, bạn có thể thực hiện cuộc gọi đến ulimit trong tập lệnh ngay trước khi thực hiện trình nền.

Nếu bạn muốn tăng ulimit cho người dùng của mình hoặc cho tất cả người dùng, bạn có thể đặt giới hạn được áp dụng thông qua pam_limitsđăng nhập. Chúng được đặt trong /etc/security/limits.conf. Trong trường hợp của bạn, bạn có thể làm một cái gì đó như:

*               hard    nofile             2048

Lưu ý rằng "cứng" biểu thị một giới hạn cứng - một giới hạn không thể vượt quá và không thể thay đổi. Người dùng có thể thay đổi giới hạn mềm (ví dụ: người nào đó không có khả năng root), nhưng không vượt quá giới hạn cứng.

Đọc limits.confđể biết thêm thông tin về việc sử dụng pam_limits.


Ở giới hạn conf tôi có 2 dòng: * nofile mềm 4096 * nofile cứng 8192 không có tác dụng.
FoxyBOA

Và bạn đã đăng xuất và đăng nhập lại kể từ khi thử nghiệm những thứ này? Điều này có nghĩa là đăng xuất ngay khỏi X / Gnome / KDE, v.v., nếu bạn đang thử điều này trên máy cục bộ
Daniel Lawson

Đúng. /etc/security/limits.conf không hoạt động với tôi. Tôi sẽ thử cách tiếp cận thứ hai.
FoxyBOA

3
/etc/security/limits.conf chỉ hoạt động đối với các dịch vụ sử dụng pam và mô-đun pam pam_limits (xem /etc/pam.d/ để biết cấu hình PAM của từng dịch vụ và cụ thể là /etc/pam.d/common-*) . Do đó nó liên quan tất cả người dùng phiên tạo ra bởi sshd, gdm, đăng nhập, vv Nó không liên quan đến tất cả các chương trình bắt đầu lúc khởi động ...
Raphaël Hertzog

Tôi đã nói điều gì đó với hiệu ứng đó, nhưng cảm ơn vì đã làm rõ nó. OP chưa làm rõ nếu đó là dịch vụ hay quy trình mà người dùng của anh ấy đang chạy.
Daniel Lawson

13

Ngoài ra còn có "tổng tối đa" các tệp đang mở được đặt trong kernel, bạn có thể kiểm tra cài đặt hiện tại bằng:

cat /proc/sys/fs/file-max 

Và đặt một giá trị mới với:

echo "104854" > /proc/sys/fs/file-max

Nếu bạn muốn giữ cấu hình giữa các lần khởi động lại, hãy thêm

sys.fs.file-max=104854

đến

/etc/sysctl.conf

Để kiểm tra mức sử dụng tệp tối đa hiện tại:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)


Của tôi cho thấy một số con số tục tĩu ở đây : 49152 0 18446744073709551615 . Tôi không hiểu tại sao hai cột đầu tiên không thêm vào cột thứ ba. Và nếu tôi có 1,8 nghìn tỷ nghìn tỷ có sẵn, tôi sẽ không thấy cách mình sử dụng tất cả.
mlissner

4

Như những người khác đã nói, bạn có thể áp dụng các giới hạn cụ thể cho mỗi người dùng hoặc nhóm trong /etc/security/limits.conf.

Lưu ý: ulimit -n hiển thị giới hạn mềm.

ulimit -H -n 

sẽ chỉ cho bạn giới hạn cứng.

Điều này làm cho đầu ra ulimit -a và ulimit -n khá khó hiểu nếu ví dụ, bạn đang tăng số lượng tệp từ 1024 lên 4096, như bạn sẽ thấy đầu ra giới hạn cứng, nhưng bạn vẫn thấy 1024 là mềm giới hạn.

Ngoài ra, hãy nhớ rằng các giới hạn này được thi hành mỗi lần đăng nhập, vì vậy hãy đăng nhập lại vào một vỏ mới và kiểm tra các thay đổi của bạn, đừng hy vọng chúng sẽ được truyền đến các thông tin đăng nhập hiện có.


2

Xin lưu ý rằng nếu bạn chạy quy trình của mình bằng cách bắt đầu-stop-daemon, cài đặt ulimits trong /etc/security/limits.conf không hoạt động. Ví dụ: nếu bạn muốn tăng giới hạn tệp mở cho tomcat lên 20000, bạn cần thêm các giới hạn này vào dòng /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Tôi đã gặp vấn đề này trên debian 6.0.4 Đối với quy trình khác, các câu trả lời sẽ có ích.


1

Nó phụ thuộc vào cách bạn bắt đầu quá trình dài của bạn. Nếu nó bắt đầu vào lúc khởi động (thông qua /etc/rcX.d/* script) thì bạn phải đặt một cuộc gọi ulimit trong tập lệnh khởi động của mình vì giới hạn mặc định được đặt bởi kernel và nó không thể điều chỉnh được nếu không biên dịch lại.

Việc sử dụng /etc/security/limits.confcó thể hoạt động nếu bạn sử dụng cronđể khởi động nó chẳng hạn với một mục như thế này:

@reboot $HOME/bin/my-program

Điều đó sẽ hoạt động vì /etc/pam.d/cron cho phép pam_limits.so.


-1

Bạn có thể thêm phần này vào /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

lưu lại sau đó khởi động lại.


3
Có điều gì mới ở đây không nằm trong câu trả lời được chấp nhận cho câu hỏi 5 tuổi này không?
Andrew Schulman

-2

Một lệnh rất hay là ulimit -ncó một vấn đề với quá nhiều kết nối và quá nhiều tệp đang mở:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Tôi đã cố gắng làm sạch câu trả lời của bạn nhưng tôi vẫn không rõ những gì bạn đang cố gắng nói với câu hỏi áp phích ban đầu. Bạn có thể thử và làm sạch điều này hơn nữa?
slm 17/03/13

Ngoài ra đây là đầu ra của ulimit -a, không ulimit -n.
Yvan
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.