Làm thế nào để ulimit -n và / Proc / sys / fs / file-max khác nhau như thế nào?


32

Tôi nhận thấy rằng trên một hình ảnh CentOS mới mà tôi vừa khởi động từ EC2, mặc định ulimit là 1024 tệp đang mở, nhưng / Proc / sys / fs / file-max được đặt ở 761.408 và tôi tự hỏi hai giới hạn này hoạt động như thế nào cùng với nhau. Tôi đoán rằng ulimit -n là giới hạn cho mỗi người dùng về số lượng mô tả tệp trong khi / Proc / sys / fs / file-max là toàn hệ thống? Nếu đó là trường hợp, giả sử tôi đã đăng nhập hai lần với cùng một người dùng - mỗi người dùng đã đăng nhập có giới hạn 1024 số lượng tệp đang mở hay đó là giới hạn 1024 tệp mở kết hợp giữa mỗi tệp được đăng nhập- ở người dùng?

Và có nhiều tác động hiệu suất để đặt mô tả tệp tối đa của bạn lên một số rất cao, nếu hệ thống của bạn không bao giờ mở rất nhiều tệp?


Đã thêm thẻ: bash linux kernel-resource resource
Warner

Câu trả lời:


28

file-maxlà Bộ mô tả tệp tối đa (FD) được thi hành ở cấp độ kernel, không thể vượt qua tất cả các quy trình mà không tăng. Cái ulimitđược thi hành ở cấp độ quy trình, có thể nhỏ hơn mức file-max.

Không có rủi ro tác động hiệu suất bằng cách tăng file-max. Các bản phân phối hiện đại có bộ FD tối đa khá cao, trong khi trước đây, nó yêu cầu biên dịch lại và sửa đổi kernel để tăng quá 1024. Tôi sẽ không tăng toàn hệ thống trừ khi bạn có nhu cầu kỹ thuật.

Cấu hình trên mỗi quy trình thường cần được điều chỉnh để phục vụ một trình nền cụ thể có thể là cơ sở dữ liệu hoặc máy chủ Web. Nếu bạn loại bỏ hoàn toàn giới hạn, daemon đó có khả năng làm cạn kiệt tất cả các tài nguyên hệ thống có sẵn; có nghĩa là bạn sẽ không thể khắc phục sự cố ngoại trừ bằng cách nhấn nút đặt lại hoặc đạp xe. Tất nhiên, một trong hai có khả năng dẫn đến tham nhũng của bất kỳ tệp đang mở nào.


Sự hiểu biết của tôi có đúng không, rằng giới hạn cho mỗi người dùng được đặt bằng ulimit là giống nhau cho tất cả người dùng? Có cách nào để sử dụng các giá trị khác nhau cho mỗi người dùng hay không?
Oliver

Có, các cài đặt có thể được đặt cả trên toàn cầu và trên cơ sở cho mỗi người dùng.
Warner

Nếu tôi nhận được bài viết của bạn đúng, điều này không đúng. Đó là mỗi quá trình được sinh ra bởi người dùng xy và điều này bị giới hạn bởi mức tối đa của hệ thống tệp được xác định trong /etc/sysctl.conf
Jeredepp

3
Các ulimitgiới hạn không phải là mỗi người dùng, nhưng mỗi quá trình! Xem unix.stackexchange.com/questions/55319/ từ
Tonin

@Tonin - Vâng, câu trả lời này chỉ sai.
Nemo

11

Giới hạn của ulimit là trên mỗi người dùng duy nhất. Vì vậy, user1, bất kể số lần đăng nhập hoặc quá trình đang chạy, sẽ bị giới hạn ở 1024. Nó được kết hợp.

Tôi không chắc chắn nếu tôi hoàn toàn hiểu ý nghĩa của câu đó (tiếng Anh không phải là tiếng mẹ đẻ của tôi) Nếu câu đó có nghĩa là cấu hình ulimit cho mô tả tệp không phải là giới hạn theo quy trình, câu trả lời được chấp nhận (AFAIK) là sai.

Ý tôi là, nếu một số người dùng đã khởi chạy 4 quy trình và cấu hình ulimit cho FD là 1024, mỗi quy trình có thể mở 1024 FD. Người dùng sẽ không bị giới hạn ở 1024 FD mà là các quy trình được đưa ra bởi người dùng đó.

Ví dụ:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Dưới đây là một ví dụ perl nơi chúng tôi đạt đến giới hạn (đó là giới hạn theo quy trình):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Kết quả:

FDs: 1021 Too many open files at ./test.pl line 8.

1021 vì có 3 mô tả tệp mở trước khi đến vòng lặp while (stdout, stdin và stderr)

Xin lỗi nếu tôi hoàn toàn sai hoặc tôi hiểu nhầm câu trả lời.


Vì vậy, bạn đã đúng. Phản hồi của @ Warner là sai theo nghĩa này vì giới hạn là trên cơ sở theo từng quy trình chứ không phải cho mỗi người dùng
filipenf
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.