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?
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?
Câu trả lời:
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.conf
like limit maxfiles
và 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
, .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 shell.
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?
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.plist
và 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
IO Error: Bad file descriptor (Write failed)
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 4096
hoặ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.
ulimit -a
).
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
(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
-h
lsof -n +c 0
để ngăn chặn quá trình cắt tên.
Đố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 launchctl
công việc từ @ninjaPixel ( https://superuser.com/a/1171028/760235 ) cho giải pháp vĩnh viễn.
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
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
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 {} \;
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ả.