Làm cách nào để thay đổi số lượng giới hạn tệp mở trong Linux? [đóng cửa]


194

Khi chạy ứng dụng của tôi đôi khi tôi gặp một lỗi về too many files open.

Chạy ulimit -acác báo cáo rằng giới hạn là 1024. Làm cách nào để tăng giới hạn trên 1024?

Chỉnh sửa ulimit -n 2048 kết quả trong một lỗi cho phép.



Tôi vừa trải qua điều này trên Centos 7 (tương tự trên RHEL) và tạo một bài đăng trên blog vì tôi gặp quá nhiều rắc rối ngay cả với tất cả các bài đăng này: mã hóa-stream-of-mindnessness / 2018/12/21 / . Thường cùng với các tệp đang mở, bạn cần tăng nproc thực sự nằm trong nhiều tệp cài đặt ... và nếu bạn sử dụng systemd / systemctl có cài đặt riêng. Đó là loại hạt.
John Humphreys - w00te

Nếu bạn đang sử dụng VSCode trên linux, cách giải quyết này có thể giúp ích: stackoverflow.com/a/55027686/1190948
Juri Sinitson

Câu trả lời:


153

Bạn luôn có thể thử làm một ulimit -n 2048. Điều này sẽ chỉ đặt lại giới hạn cho trình bao hiện tại của bạn và số bạn chỉ định không được vượt quá giới hạn cứng

Mỗi hệ điều hành có một thiết lập giới hạn cứng khác nhau trong một tệp cấu hình. Chẳng hạn, giới hạn tệp mở cứng trên Solaris có thể được đặt khi khởi động từ / etc / system.

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

Trên OS X, dữ liệu tương tự này phải được đặt trong /etc/sysctl.conf.

kern.maxfilesperproc=166384
kern.maxfiles=8192

Trong Linux, các cài đặt này thường ở /etc/security/limits.conf.

Có hai loại giới hạn:

  • giới hạn mềm chỉ đơn giản là giới hạn hiện hành
  • giới hạn cứng đánh dấu giá trị tối đa không thể vượt quá bằng cách đặt giới hạn mềm

Giới hạn mềm có thể được đặt bởi bất kỳ người dùng nào trong khi giới hạn cứng chỉ có thể thay đổi bằng root. Giới hạn là một tài sản của một quá trình. Chúng được kế thừa khi một tiến trình con được tạo để các giới hạn toàn hệ thống phải được đặt trong quá trình khởi tạo hệ thống trong các tập lệnh init và giới hạn người dùng nên được đặt trong quá trình đăng nhập của người dùng, ví dụ như bằng cách sử dụng pam_limits.

Thường có các giá trị mặc định được đặt khi máy khởi động. Vì vậy, mặc dù bạn có thể đặt lại ulimit của mình trong một vỏ riêng lẻ, bạn có thể thấy rằng nó đặt lại về giá trị trước đó khi khởi động lại. Bạn có thể muốn grep script khởi động của mình cho các lệnh ulimit tồn tại nếu bạn muốn thay đổi mặc định.


4
bạn có thể cho tôi biết làm thế nào để sử dụng này trong windows?
Pritam

@hoyhoy Mình có thể thay đổi như 2048vậy chứ không phải 4500tại sao? xem cái này
alrcal

@GaneshKrishnan cần thêm gì vào tập tin linux mà bạn đã đề cập?
avirus sanjay 19/12/18

@Pritam Windows không có ulimit. Bạn phải chỉ định những gì bạn đang sử dụng (ví dụ WSL, Cygwin).
Melebius

99

Nếu bạn đang sử dụng Linux và bạn gặp phải lỗi cấp phép, bạn sẽ cần tăng giới hạn cho phép trong /etc/limits.confhoặc /etc/security/limits.conftệp (nơi tệp được đặt tùy thuộc vào bản phân phối Linux cụ thể của bạn).

Ví dụ: để cho phép bất kỳ ai trên máy tăng số lượng tệp đang mở lên tới 10000, hãy thêm dòng vào limits.conftệp.

* hard nofile 10000

Sau đó đăng xuất và đăng nhập lại vào hệ thống của bạn và bạn sẽ có thể làm:

ulimit -n 10000

không có lỗi cho phép.


6
LƯU Ý: Wildcard không áp dụng cho rootngười dùng. Bạn phải xác định root hard nofile 10000nếu bạn muốn điều chỉnh rootgiới hạn.
Joshua Pinter

1
@JoshPinter Haha, tôi mới dành khoảng 3 tiếng đồng hồ để xem qua mọi hướng dẫn về cách thay đổi ulimitvà cuối cùng phát hiện ra tôi đã đăng nhập bằng root. Đó là lý do tại sao tôi tiếp tục nhìn thấy 1024 in ulimit -a. Tôi đã thay đổi wildcare, và thêm một *bên trong limits.conf. Bây giờ tất cả đều tốt, (tôi đang sử dụng các phím ssh đừng lo lắng: P) - Cảm ơn bạn !!!
NiCk Newman

1
@NiCkNewman Tôi rất vui vì bạn đã cười về điều đó! Đó là một đặc điểm tốt ở một người lập trình / sysops. Tôi đã làm điều tương tự và không vui vẻ như vậy. Vui vì nó đã giúp! :)
Joshua Pinter

BỀN VỮNG: Bạn cũng có thể tìm thấy một cấu hình trong thư mục này : /etc/security/limits.d/.
Waldemar Wosiński

2
Tôi đã mở /etc/security/limits.conf lần đầu tiên và nhận thấy rằng mọi thứ đều được nhận xét ngoài đó. Giá trị mặc định của "nofile cứng" là gì?
ka3ak

36

1) Thêm dòng sau vào /etc/security/limits.conf

webuser hard nofile 64000

sau đó đăng nhập với tư cách là người dùng web

su - webuser

2) Chỉnh sửa hai tệp sau cho trình duyệt web

chắp thêm tập tin .bashrc và .bash_profile bằng cách chạy

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) Đăng xuất, sau đó đăng nhập lại và xác minh rằng các thay đổi đã được thực hiện chính xác:

$ ulimit -a | grep open
open files                      (-n) 64000

Đó là nó và họ bùng nổ, bùng nổ bùng nổ.


9
Nếu bạn thay đổi dòng của mình trong giới hạn. Thông tin từ 'cứng' thành 'mềm', nó sẽ trở thành mặc định mới và không yêu cầu thay đổi đối với cấu hình bash.
RishiD

Có vẻ như bạn đang lặp lại một bước bổ sung. Đặt giới hạn một mình sẽ làm tương tự như hồ sơ, nhưng trên tất cả các phiên.
Eddie

6

Nếu một số dịch vụ của bạn gặp khó khăn, đôi khi việc đưa các lệnh thích hợp vào tập lệnh init của dịch vụ sẽ dễ dàng hơn. Ví dụ: khi Apache đang báo cáo

[alert] (11) Tài nguyên tạm thời không khả dụng: apr_thread_create: không thể tạo luồng công nhân

Cố gắng đưa ulimit -s unlimitedvào /etc/init.d/httpd. Điều này không yêu cầu khởi động lại máy chủ.

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.