Câu hỏi Có bản sửa lỗi cho lỗi "Quá nhiều tệp trong hệ thống" trên OS X 10.7.1 không?


Tôi cần phải loại bỏ giới hạn pesky "Quá nhiều tệp mở trong hệ thống" trên OS X 10.7.1.

Là có một cách?


150
2018-06-07 08:52


gốc


Bạn có muốn giải thích thêm về thời điểm điều này xảy ra không? Trong hoàn cảnh nào? - slhck
@slhck - Tôi có cùng một vấn đề. Hoàn cảnh cơ bản là "ngẫu nhiên". Tôi là nhà phát triển, vì vậy tôi đang sử dụng máy Mac khá nhiều: chạy một hoặc nhiều cơ sở dữ liệu, máy chủ web, công cụ kiểm tra, một hoặc nhiều trình duyệt và trình phát nhạc cùng một lúc. Google Chrome có vẻ là một chương trình có nhiều tệp mở. - Nathan Long
Trên thực tế, "sử dụng nặng nề" của tôi không phải là vấn đề; cài đặt của tôi cho số lượng tệp mở tối đa cho kernal và mỗi quá trình thấp hơn nhiều so với giá trị mặc định. - Nathan Long
Nếu bạn đọc nhận xét của Nathan và tự hỏi tại sao anh ta không bao gồm bất kỳ chi tiết nào về mặc định, đó là bởi vì anh ta đã viết ra tất cả câu trả lời của mình, bên dưới. (Câu trả lời hay! :) - Olie
Tôi đang ở trong hoàn cảnh sử dụng tương tự như Nathan Long, và tìm thấy khởi động lại Apache là bước duy nhất "giải quyết" vấn đề. Tôi áp dụng tất cả các giới hạn dưới đây nhưng họ không giúp đỡ ngay lập tức. Tôi đang chạy thử nghiệm dòng lệnh phpUnit> máy chủ selen> firefox> apache> php> mysql tất cả trên cùng một macbook. Được sử dụng để làm việc tốt cho đến khi tôi nâng cấp lên mavericks. Lỗi tôi nhận được là trong webapp đang được thử nghiệm, tức là php / apache hết tệp, vì vậy có lẽ không được kiểm soát bởi cài đặt trình bao. - scipilot


Các câu trả lời:


Theo bài viết hữu ích này (tôi khuyên bạn nên đọc):

Theo mặc định, số lượng tệp tối đa mà Mac OS X có thể mở được đặt   đến 12,288 và số tệp tối đa mà một quy trình nhất định có thể mở là   10.240.

Bạn có thể kiểm tra chúng với:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Bạn có thể tăng các giới hạn (có nguy cơ của riêng bạn) với:

  • sysctl -w kern.maxfiles=20480 (hoặc bất kỳ số nào bạn chọn)
  • sysctl -w kern.maxfilesperproc=18000 (hoặc bất kỳ số nào bạn chọn)

Để thực hiện thay đổi vĩnh viễn, hãy sử dụng sudo để đặt cài đặt của bạn /etc/sysctl.conf (mà bạn có thể phải tạo), như sau:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Lưu ý: Trong OS X 10.10 trở xuống, bạn có thể thêm cài đặt /etc/launchd.conf như limit maxfiles và nó sẽ ghi đè bất cứ điều gì bạn đặt ở đây.

Một lần nữa, từ bài báo:

Khi bạn đã thực hiện việc này, chính hạt nhân sẽ có số lượng tối đa   các tệp nhưng trình bao có thể không. Và vì hầu hết các quy trình sẽ mất   nhiều tệp này sẽ được khởi tạo bởi trình bao mà bạn   sẽ muốn tăng điều đó.

Lệnh cho điều đó là:

ulimit -S -n 2048 # or whatever number you choose

Sự thay đổi đó cũng là tạm thời; nó chỉ kéo dài cho phiên trình bao hiện tại. Bạn có thể thêm nó vào tệp cấu hình vỏ của bạn (.bashrc, .zshrc hoặc bất cứ điều gì) nếu bạn muốn nó chạy mỗi khi bạn mở một trình bao.


199
2018-06-29 20:23



giới hạn nào áp dụng cho các quy trình được khởi chạy bằng cách nhấp vào các biểu tượng trong vùng khởi chạy? Và làm thế nào để thay đổi giới hạn đó? Khi bạn nói "shell", tôi giả sử bạn có nghĩa là một trình bao đầu cuối tương tác. - Cheeso
@Cheeso - Tôi suy nghĩ rằng giới hạn hệ thống tổng thể (sysctl) hoặc giới hạn khởi chạy, tùy theo mức nào thấp hơn, kiểm soát điều đó. - Nathan Long
tạo một /etc/launchd.conf với nội dung giới hạn maxfiles 1000000 1000000 làm việc tuyệt vời cho tôi! (OSX 10.8.2 tại đây) - Zugwalt
tôi đặt kern.maxfiles=65000 kern.maxfilesperproc=65000 trong /etc/sysctl.conf và khởi động lại. kern.maxfiles đã bị bỏ qua và giữ nguyên mặc định nhưng kern.maxfilesperproc được đặt thành 65000. Tôi không có /etc/launchd.conf vì vậy có chuyện gì với nó? - pferrel
Nếu bất cứ ai có vấn đề với các tập tin tối đa không gắn bó, đó là bởi vì có một dấu cách sau khi dòng maxfiles, mà cần phải được xóa. - jjathman


Có vẻ như có một phương pháp hoàn toàn khác để thay đổi giới hạn tệp mở đối với mỗi phiên bản OS X!

Dành cho OS X Sierra (10.12.X) bạn cần:

1. Tạo tệp tại /Library/LaunchDaemons/limit.maxfiles.plist và dán các mục sau vào (cảm thấy tự do thay đổi hai số (tương ứng là giới hạn mềm và cứng):

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">  
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. Thay đổi chủ sở hữu của tệp mới của bạn:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3.  Tải các cài đặt mới này:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Cuối cùng, hãy kiểm tra xem giới hạn có chính xác không:

launchctl limit maxfiles

51
2018-01-24 14:56



làm việc hoàn hảo, cảm ơn! Trong trường hợp của tôi, lỗi được biểu hiện trong quá trình java với thông báo IO Error: Bad file descriptor (Write failed) - agradl
Cũng làm việc trên El Capitan 10.11.6 - Troy Daniels
vẫn không thể thay đổi ulimit cho shell. Tối đa vẫn là 1024 bất cứ điều gì tôi làm - DataGreed
Ở bước 2 chạy: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist - Hai Nguyen


Bạn sẽ cần phải tăng cài đặt ulimit của bạn - nó khá thấp trên OS X những ngày này - 256 theo mặc định. Thêm vào ulimit -n 4096 hoặc tương tự như ~ / .profile hoặc tương đương của bạn và điều đó sẽ giải quyết nó trong môi trường địa phương của bạn. Chạy ulimit -a để kiểm tra các cấp độ hiện tại của bạn

Để xem cài đặt hệ thống, hãy chạy cài đặt này:

launchctl limit maxfiles

Nó được thiết lập khá cao hơn một chút ở Lion (10240) trên cơ sở từng quá trình so với trước đây. Nhưng nếu bạn vẫn đánh nó ở đó thì bạn có thể đặt nó cao hơn bằng cách sử dụng lệnh tương tự với các mức mong muốn. Để thực hiện các thay đổi vĩnh viễn /etc/launchd.conf là nơi bạn cần thêm các dòng có liên quan.


29
2018-06-07 11:09



256? Đó là 2560 bộ mô tả tập tin cho tôi và tôi chưa bao giờ thay đổi nó. Giới hạn là 266 quy trình (c.f. ulimit -a). - slhck
Tương tự cho tôi, 256 tệp trên MacOS X Maverick - Climbatize
256 trên OS X Yosemite - Alexander
256 trên El Capitan, quá. - TMN
256 ở Yosemite. - Jaec


Tùy chọn khác có thể tìm ra thủ phạm:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Đối với người cuối cùng, bạn có thể xem những tệp nào đang mở:

sudo lsof -n | grep socketfil

Và giết quá trình nếu muốn

kill $pid

Từ các ý kiến:

Đối với những gì nó có giá trị, bạn cũng có thể nhận được một danh sách các ID quá trình với các tập tin mở nhất bằng cách sử dụng

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

17
2018-02-18 00:42



Hữu ích! Nhưng sắp xếp trên OS X (10.11) không mất -h. (Có lẽ -g?) - Robert Calhoun
Đối với tôi làm việc tốt mà không cần -h (OS X 10.12.3): sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail - vearutop
Vì vậy, được nó mà không có -h - sanmai
Đây là câu trả lời duy nhất đã giúp tôi để gốc gây ra vấn đề của tôi .. cảm ơn :) - SgtPooki
Đối với những gì nó có giá trị, bạn cũng có thể nhận được một danh sách các ID quá trình với các tập tin mở nhất bằng cách sử dụng lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail. - Chris Frederick


Folks, trên Mavericks 10.9.4

ulimit -n 2048 hoạt động tốt. Bạn có thể cần phải khởi chạy một phiên đăng nhập mới.


9
2017-09-04 16:19





Tôi đã gặp nó khi đang thực hiện một chmod -R vì vậy tôi nhận được nó bằng cách thực hiện các bước nhỏ hơn, ví dụ:

# for each directory
find . -type d -exec chmod 755 {} \;

0
2017-12-14 18:50



Trong khi điều này có thể là một công việc xung quanh, nó không xuất hiện để thực sự trả lời câu hỏi. Có lẽ giải thích rằng bạn không thể loại bỏ thông điệp và sau đó đề xuất điều này như một cách để làm cho nó ít hơn của một vấn đề sẽ cải thiện câu trả lời của bạn. - music2myear


Bạn có thể chạy

lsof -n

quá trình mở quá nhiều tệp.

sau đó giết nó.

hoặc là

sysctl -w kern.maxfiles=20480

thay đổi nó thành lớn hơn.


0
2018-05-18 02:52



Vui lòng giải thích cách câu trả lời này khác với câu trả lời đã được đưa ra. - Stephen Rauch