Lệnh nào kiểm soát giới hạn tệp mở?


19

Tập tin lệnh / cấu hình nào kiểm soát giới hạn tệp mở trên OS X? Có một lệnh khác cho OS X 10.5 / 10.6 / 10.7 không? Các tùy chọn tôi khám phá dưới đây là ulimit, sysctllaunchctl

"Quá nhiều tệp đang mở" rõ ràng là một lỗi phổ biến trên Leopard, có lẽ các phiên bản khác của OS X:

Có nhiều cách (liên quan?) Để xem giới hạn tệp đang mở:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

Nó đã được tuyên bố trong một số bài viết ở trên rằng chúng có thể được sửa đổi bằng các lệnh sau:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Tuy nhiên, trong số các lệnh trên, chỉ sysctllệnh có bất kỳ tác dụng rõ ràng (ví dụ ulimit -nlaunchctl limitcho thấy không có sự thay đổi sau khi lệnh trên đã được nhập vào, trong khi sysctl -akhông hiển thị những thay đổi yêu cầu).

Các vị trí tương ứng để thay đổi các tham số này cho HĐH là:

/etc/sysctl.conf
/etc/launchd.conf

Tôi cũng phát hiện ra một câu trả lời chỉ đọc ulimitphần vỏ hiện tại.

Làm thế nào tôi có thể điều chỉnh lên các file tối đa / tối đa mở file giới hạn về hệ điều hành MacOS?

Câu trả lời:


9

Câu trả lời đơn giản được sử dụng là có nhiều giới hạn và giới hạn thấp nhất mà bạn đạt được trong một trường hợp cụ thể sẽ tạo ra lỗi của bạn. Bây giờ vào ngày 10.12 launchctl limit maxfilescũng là trong hỗn hợp. Để biết chi tiết về việc thực hiện, câu trả lời tuyệt vời này đang nhận được tiền thưởng và xứng đáng nhận được nhiều phiếu hơn so với câu tôi có thể đưa ra.

chủ đề liên quan khác là:

Các ulimitmức được đặt thấp để tránh một kịch bản shell nghèo từ ngập hạt nhân với các tập tin mở.

kern.maxfilesperprocđể chừa một khoảng trống nhỏ trong số lượng tệp tối đa để một tiến trình có thể sử dụng hầu hết nhưng không phải tất cả không gian xử lý tệp mở từ kernel.

Đối với các tình huống bình thường, kern.maxfileslà yếu tố giới hạn cuối cùng.

Trên Sierra - giới hạn là 256 tệp mở và tối đa không giới hạn, vì vậy tôi thấy rằng có 3 đến 4 nghìn tệp được đặt cho giới hạn mềm hoạt động cho tất cả phần cứng của chúng tôi và vẫn giữ cho hệ thống phản hồi khi quá trình chạy trốn mở quá nhiều các tập tin. Chúng tôi muốn giữ cho các máy chủ phát triển của mình ở giới hạn 256 để chúng tôi nắm bắt được phần mềm bị rò rỉ và có vấn đề trong quá trình phát triển / dàn dựng và kiểm tra thay vì tìm hiểu về nó trong sản xuất.

Tôi không phải là fan hâm mộ của các tệp 10k - có thể với bộ lưu trữ APFS và NVMe, chúng ta sẽ thấy ngày không thể tưởng tượng được, nhưng hãy cố gắng gắn bó với hàng trăm hoặc hàng nghìn cho giới hạn tệp của bạn. Đặc biệt nếu máy Mac của bạn có giới hạn quy trình thấp , việc có quá nhiều tệp được mở bởi quá ít quá trình có thể gây ra sự cố.


9

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ở cho từng phiên bản OS X.

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

1. Trong việc Library/LaunchDaemonstạo một tệp có tên 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

Tôi dường như gặp khó khăn khi đặt maxfiles thành không giới hạn theo cách này bằng cách đặt giá trị thứ hai thành 'không giới hạn'. Có suy nghĩ gì không?
user200857

7

Sau đây sẽ giải quyết hầu hết các vấn đề phổ biến (và được liệt kê theo thứ tự phân cấp của chúng):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

Ghi chú:

  1. Bạn sẽ cần phải khởi động lại để những thay đổi này có hiệu lực.
  2. AFAIK bạn không còn có thể đặt giới hạn thành 'không giới hạn' trong OS X
  3. maxfiles launchctl được giới hạn bởi maxfiles sysctl, và do đó không thể vượt quá chúng
  4. sysctl dường như kế thừa kern.maxfilesperproc từ các maxfiles launchctl
  5. Theo mặc định, ulimit thừa hưởng giá trị 'tệp mở' từ launchctl
  6. bạn có thể đặt một ulimit tùy chỉnh trong / etc / profile hoặc ~ / .profile; trong khi điều này không bắt buộc tôi đã cung cấp một ví dụ
  7. Hãy thận trọng khi đặt bất kỳ giá trị nào trong số này thành một số rất cao khi so sánh với mặc định của chúng - các tính năng tồn tại tính ổn định / bảo mật. Tôi đã lấy những số ví dụ này mà tôi tin là hợp lý, được viết trên các trang web khác.

0

Nói một cách đơn giản:

  • Các ulimitlệnh cung cấp "quyền kiểm soát các nguồn lực sẵn có để vỏ và các quá trình nó tạo ra" (xem: help ulimitman bash). Tài nguyên được cung cấp cho shell bị giới hạn bởi các giới hạn tài nguyên hệ thống.

  • Việc launchctlkiểm soát mức tiêu thụ tài nguyên hệ thống tối đa theo quy trình hiện tại (xem: man setrlimitman launchctl). Giá trị tối đa bị giới hạn bởi các giới hạn kernel.

  • Các sysctlgiới hạn hạt nhân kiểm soát (xem: man sysctlGiới hạn hạt nhân điều chỉnh của BSD ).

Để tăng giới hạn, bạn có thể sử dụng từng lệnh, tùy thuộc vào vấn đề.

Xem thêm: Mối quan hệ giữa `launchctl giới hạn` và` ulimit` là gì?


Đối với sự cố với quá nhiều tệp đang mở, điều này phụ thuộc vào mức giới hạn chính xác hoặc mềm đã đạt được (cho dù đó là tập lệnh shell cục bộ, tập lệnh toàn cầu chạy root, ứng dụng hay tất cả các quy trình cùng một lúc). Thật đáng để tăng tất cả các giới hạn (giới hạn shell, launchd và kernel).

Để tăng giới hạn liên tục, hãy xem: Làm thế nào để kiểm soát liên tục mức tiêu thụ tài nguyên hệ thống tối đa trên Mac?

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.