Có cách khắc phục cho lỗi Quá nhiều tệp đang mở trong hệ thống Lỗi trên OS X 10.7.1 không?


191

Tôi cần thoát khỏi giới hạn "Quá nhiều tệp đang mở trong hệ thống" trên OS X 10.7.1. 

Là có một cách?


4
Bạn có muốn giải thích thêm về khi điều này xảy ra? Trong hoàn cảnh nào?
slhck

1
@slhck - Mình gặp vấn đề tương tự. Các trường hợp về cơ bản là "ngẫu nhiên." Tôi là một nhà phát triển, vì vậy tôi đang sử dụng máy Mac của mình 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 dường như là một chương trình có rất nhiều tệp được mở.
Nathan Long

Trên thực tế, "sử dụng nặng" 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 hạt nhân và mỗi quá trình thấp hơn nhiều so với giá trị mặc định.
Nathan Long

2
Nếu bạn đọc bình luận 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ề các mặc định, thì đó là vì anh ta đã đánh vần tất cả trong 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à thấy việc 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 mức tăng giới hạn dưới đây nhưng chúng không giúp được ngay lập tức. Tôi đang chạy các dòng lệnh phpUnit tests> selenium server> firefox> apache> php> mysql all trên cùng một macbook. Được sử dụng để hoạt động tốt cho đến khi tôi nâng cấp lên mavericks. Lỗi tôi nhận được là trong ứng dụng web đang được thử nghiệm, tức là php / apache hết tệp, do đó có lẽ không được kiểm soát bởi cài đặt shell.
scipilot

Câu trả lời:


225

Theo bài viết hữu ích này (mà 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 thành 12.288 và số lượng 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 những điều này 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 cứ số nào bạn chọn)
  • sysctl -w kern.maxfilesperproc=18000 (hoặc bất cứ số nào bạn chọn)

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

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 vào /etc/launchd.conflike limit maxfilesvà nó sẽ ghi đè lên bất cứ thứ gì bạn đặt ở đây.

Một lần nữa, từ bài viết:

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

Lệnh cho đó 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 shell hiện tại. Bạn có thể thêm nó vào tập tin của bạn cấu hình vỏ ( .bashrc, .zshrchoặc bất cứ điều gì) nếu bạn muốn nó chạy mỗi khi bạn mở một shell.


1
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 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 vỏ thiết bị đầu cuối tương tác.
Cheeso

@Cheeso - Tôi nghĩ rằng giới hạn hệ thống tổng thể (sysctl) hoặc giới hạn khởi động, tùy theo mức nào thấp hơn, sẽ kiểm soát điều đó.
Nathan Long

1
tạo một /etc/launchd.conf với giới hạn nội dung maxfiles 1000000 1000000 hoạt động rất tốt cho tôi! (OSX 10.8.2 tại đây)
Zugwalt

1
Tôi đặt kern.maxfiles=65000 kern.maxfilesperproc=65000/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ậy thì sao?
pferrel

2
Nếu bất cứ ai có vấn đề với các tệp max không bị dính, đó là do có một khoảng trống ở sau dòng maxfiles, cần phải xóa.
jjathman

62

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

Đối với OS X Sierra (10.12.X), bạn cần:

1. Tạo một tệp tại /Library/LaunchDaemons/limit.maxfiles.plistvà dán các mục sau vào (thoải mái thay đổi hai số (lần lượt 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 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, kiểm tra xem các giới hạn có đúng không:

launchctl limit maxfiles

làm việc hoàn hảo, cảm ơn! Trong trường hợp của tôi, lỗi xuất hiện trong một quy trình java với thông báoIO Error: Bad file descriptor (Write failed)
agradl

1
Cũng hoạt động trên El Capitan 10.11.6
Troy Daniels

vẫn không thể thay đổi ulimit cho vỏ. Tối đa ở lại 1024 bất cứ điều gì tôi làm
DataGreed

Ở bước 2 chạy: sudo chmod 600 /L Library / LaunchDaemons / musit.maxfiles.plist sudo chown root /L Library / LaunchDaemons / musit.maxfiles.plist
Hai Nguyen

33

Bạn sẽ cần tăng cài đặt ulimit của mình - khá thấp trên OS X những ngày này - 256 theo mặc định. Thêm ulimit -n 4096hoặc tương tự với ~ / .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ấp độ hiện tại của bạn

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

launchctl limit maxfiles

Nó được đặt khá cao hơn một chút trong Lion (10240) trên cơ sở mỗi quá trình so với trước đây. Nhưng nếu bạn vẫn nhấn nó ở đó thì bạn có thể đặt nó cao hơn bằng cách sử dụng cùng một lệnh 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.


1
256? Đó là mô tả tập tin 2560 cho tôi và tôi chưa bao giờ thay đổi nó. Giới hạn là 266 quy trình (cf ulimit -a).
slhck

2
Tương tự với tôi, 256 tệp trên MacOS X Maverick
Climbatize

4
256 trên OS X Yosemite cũng vậy
Alexander

2
256 trên El Capitan, quá.
TMN

1
256 ở Yosemite.
Jaec

31

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

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

Đối với cái cuối cùng bạn có thể thấy những tập tin đang mở:

sudo lsof -n | grep socketfil

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

kill $pid

Từ các ý kiến:

Để biết giá trị của nó, bạn cũng có thể nhận danh sách ID quy trình có tệp mở nhất bằng cách sử dụng

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

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 chỉ cần không có -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop

Vì vậy, không có nó-h
sanmai

Đây là câu trả lời duy nhất giúp tôi khắc phục được vấn đề của mình .. cảm ơn :)
SgtPooki 11/03/2017

1
Sử dụng lsof -n +c 0để ngăn chặn quá trình cắt tên.
vaughan

10

Mọi người, trên Mavericks 10.9.4

ulimit -n 2048hoạ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.


3

Đối với macOS mới nhất (tại thời điểm viết: 10.14.1), bạn có thể sử dụng sudo launchctl limit maxfiles 64000 524288(theo mặc định là 256), nhưng nó chỉ hoạt động trong phiên hiện tại. Sử dụng launchctlcông việc từ @ninjaPixel ( https://superuser.com/a/1171028/760235 ) cho giải pháp vĩnh viễn.


Làm thế nào bạn đến với số 524288? Giá trị trước đây của tôi là 256 và không giới hạn.
Chip Roberson

1

Bạn có thể chạy

lsof -n

Quá trình nào mở quá nhiều tập tin.

sau đó giết nó

hoặc là

sysctl -w kern.maxfiles=20480

thay đổi nó để lớn hơn


3
Vui lòng giải thích câu trả lời này khác với câu trả lời như thế nào.
Stephen Rauch

1

Sau tất cả các thay đổi trên java của tôi đã không tạo ra hơn 10000 tệp. Giải pháp là cờ jvm này -XX: -MaxFDLimit


0

Tôi đã gặp nó khi đang thực hiện một chmod -R vì vậy tôi đã khắc phụ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 {} \;

1
Mặc dù đây có thể là một cách giải quyết, nhưng nó không thực sự trả lời câu hỏi. Có lẽ giải thích rằng bạn không thể thoát khỏi tin nhắn và sau đó đề xuất đây là một cách để làm cho nó ít vấn đề hơn sẽ cải thiện câu trả lời của bạn.
music2myear

0

Tương tự như https://superuser.com/a/1171028/367819

Để kiểm tra các giới hạn hiện tại trên hệ thống Mac OS X của bạn, hãy chạy:

launchctl limit maxfiles

Hai cột cuối cùng là giới hạn mềm và cứng tương ứng.

Để điều chỉnh giới hạn tệp mở trên cơ sở toàn hệ thống trong Mac OS X Yosemite, bạn phải tạo hai tệp cấu hình. Đầu tiên là tệp danh sách thuộc tính (còn gọi là plist) trong /L Library / LaDDaemons / limit.maxfiles.plist có chứa cấu hình XML sau:

<?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>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

Điều này sẽ đặt giới hạn tệp mở thành 200000. Tệp cấu hình plist thứ hai nên được lưu trữ trong /L Library / LaDDaemons / limit.maxproc.plist với các nội dung sau:

<?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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Cả hai tập tin plist phải được sở hữu bởi root: wheel và có quyền -rw-r - r--. Quyền này phải được đặt theo mặc định, nhưng bạn có thể đảm bảo rằng chúng được đặt đúng chỗ bằng cách chạy sudo chmod 644. Mặc dù các bước được giải thích ở trên sẽ khiến giới hạn tệp mở toàn hệ thống được đặt chính xác khi khởi động lại, bạn có thể áp dụng chúng theo cách thủ công bằng cách chạy giới hạn launchctl.

Ngoài việc đặt các giới hạn này ở cấp hệ thống, chúng tôi khuyên bạn cũng nên đặt ở cấp phiên bằng cách nối thêm các dòng sau vào tệp bashrc, bashprofile hoặc tệp tương tự của bạn:

ulimit -n 200000
ulimit -u 2048

Giống như các tệp plist, bashrc hoặc tệp tương tự của bạn phải có quyền -rw-r - r--. Tại thời điểm này, bạn có thể khởi động lại máy tính của mình và nhập ulimit -n vào thiết bị đầu cuối của bạn. Nếu hệ thống của bạn được cấu hình đúng, bạn sẽ thấy maxfiles đã được đặt thành 200000.


Bạn có thể theo dõi bài viết này để biết thêm chi tiết.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Hãy nhớ khởi động lại máy Mac của bạn để có các giá trị hiệu quả.


Bài đăng phải được đánh dấu là trùng lặp nếu đã có câu trả lời, nếu không, vui lòng gửi thông tin liên quan từ một liên kết, vì liên kết có thể không có giá trị mãi mãi.
zymhan
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.