Làm thế nào để phá vỡ ra quá nhiều tập tin đang mở


8

Nếu tôi muốn xem tất cả các tệp nhật ký có liên quan của máy chủ apache2 của mình cùng một lúc, tôi sử dụng

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Nhưng vì hiện tại có quá nhiều tệp, tôi muốn tăng giới hạn đó.

Làm thế nào tôi có thể tăng nó cho một phiên ssh? Và làm thế nào tôi có thể tăng nó trên toàn cầu?

Tôi có thể thấy giới hạn tệp đang mở là 1024 trên máy của mình:

ulimit -n
1024

Vượt quá giới hạn tập tin thường là một dấu hiệu của một vấn đề. Như đã lưu ý, bạn có thể gặp vấn đề với xoay vòng nhật ký. (Nhật ký xoay có thể bỏ lệnh của bạn.) Bên ngoài / var / log / apache2 không nên có nhiều nhật ký (bất kỳ) liên quan đến máy chủ Apache của bạn. Dựa trên mẫu grep của bạn, bạn có thể muốn hạn chế quyền truy cập vào nhật ký truy cập.
BillThor

cảm ơn vì gợi ý, nhưng logrotaion của tôi hoạt động tốt. Tôi có rất nhiều nhật ký, vì tất cả 1025 tên miền trên máy chủ của tôi có tệp nhật ký riêng của họ;)
rubo77

1
Các mẫu của bạn trông giống như chúng cũng sẽ nhận các bản ghi lỗi cũng như các bản ghi truy cập. Đây sẽ là một vấn đề nhỏ nếu bạn có một bản ghi lỗi. Nếu bạn để cái này chạy trong một cái vỏ, bạn có thể muốn sử dụng -Fthay vì -fđể các bản ghi được mở lại khi xoay.
BillThor

Câu trả lời:


15

Điều quan trọng cần biết là có hai loại giới hạn:

  • Một giới hạn cứng chỉ có thể cấu hình bằng root. Đây là giá trị cao nhất có thể (giới hạn) cho giới hạn mềm.
  • Một giới hạn mềm có thể được thiết lập bởi một người dùng bình thường. Đây là giới hạn thực tế có hiệu lực.

Giải pháp cho một phiên duy nhất

Trong vỏ đặt giới hạn mềm:

ulimit -Sn 2048

Ví dụ này sẽ tăng giới hạn thực tế lên 2048 nhưng lệnh sẽ chỉ thành công nếu giới hạn cứng (kiểm tra ulimit -Hn:) giống hoặc cao hơn. Nếu bạn cần giá trị cao hơn, hãy tăng giới hạn cứng bằng một trong các phương pháp dưới đây. Các giới hạn được đặt cho mỗi quy trình và chúng được kế thừa bởi các quy trình mới được sinh ra, do đó, bất cứ điều gì bạn chạy sau lệnh này trong cùng một trình bao sẽ có các giới hạn mới.

Thay đổi giới hạn cứng trong một phiên duy nhất

Điều này không dễ dàng vì chỉ root mới có thể thay đổi giới hạn cứng và sau khi chuyển sang root bạn phải chuyển về người dùng ban đầu. Đây là giải pháp với sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Giải pháp toàn hệ thống

Trong Debian và nhiều hệ thống khác sử dụng, pam_limitsbạn có thể đặt giới hạn cho toàn hệ thống trong /etc/security/limits.confvà trong các tệp trong /etc/security/limits.d. Các tập tin conf chứa mô tả. Dòng ví dụ:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Điều này sẽ đặt giới hạn cứng và giới hạn mềm mặc định cho người dùng trong nhóm webadminssau khi đăng nhập.

Các giới hạn khác

Giá trị giới hạn cứng bị giới hạn bởi giới hạn toàn cầu của giá trị mô tả tệp mở trong /proc/sys/fs/file-maxđó khá cao theo mặc định trong các bản phân phối Linux hiện đại. Giá trị này được giới hạn bởi NR_OPENgiá trị được sử dụng trong quá trình biên dịch kernel.

Có giải pháp nào tốt hơn không?

Có lẽ bạn có thể kiểm tra xem tất cả các *logtệp bạn cung cấp có phải tail -flà các tệp thực sự hoạt động cần được theo dõi hay không. Có thể một số trong số chúng đã bị đóng để đăng nhập và bạn chỉ có thể mở một số lượng tệp nhỏ hơn.


ulimit -Sn 4096 -bash: ulimit: mở tệp: Kann die Grenze nicht ändern: Das Argument ist ungültig - có nghĩa là đối số không hợp lệ
rubo77

@ rubo77: Tôi đã thêm thông tin về giới hạn cứng có lẽ là nguyên nhân của vấn đề.
pabouk

@ rubo77: Cũng có thể đặt giới hạn cứng trong phiên shell nhưng có khó không khi bạn phải suroot và suquay lại người dùng:su -c "ulimit -Hn 6000 ; su $USER"
pabouk

OK, vì vậy để thay đổi tạm thời giới hạn tôi sẽ sử dụng ulimit -Hn 6000; ulimit -Sn 6000làm root sau đó
rubo77

1
@amenthes Tôi đoán bạn có nghĩa là các tập tin cấu hình trong /etc/limits.*. Các giới hạn này được áp dụng bất cứ khi nào mô-đun PAM pam_limits.sođược gọi. Thông thường đó là lúc bắt đầu một phiên. Ví dụ, trong Ubuntu 14.04, nó nằm trong các công cụ / lệnh này : cron, login(đăng nhập bảng điều khiển văn bản), lightdm(đăng nhập GUI) , su. Bạn có thể đặt nơi được pam_limitssử dụng trong /etc/pam.*. Xem ví dụ: faqs.org/docs/securing/chap5sec44.html
pabouk

0

Tôi đã có Cảnh báo PHP trong lỗi Apache của mình.log:

failed to open stream: Too many open files in ...

Vì vậy, tôi phát hiện ra, apache đặt giá trị này riêng lẻ trong khi bắt đầu (trên Ubuntu 14.04 của tôi). Nó được cấu hình trong /etc/apache2/envvars. Nó nói rằng:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

vì vậy tôi phải điều chỉnh dòng thứ ba.

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.