Đâu là những vết loét mặc định được chỉ định trên OS X (10.5)?


26

nofileGiới hạn mặc định cho tài khoản người dùng OS X dường như là khoảng 256 mô tả tệp trong những ngày này. Tôi đang cố kiểm tra một số phần mềm cần nhiều kết nối hơn là mở cùng một lúc.

Trên hộp Debian thông thường chạy mô-đun giới hạn pam, tôi sẽ chỉnh sửa /etc/security/limits.confđể đặt giới hạn cao hơn cho người dùng sẽ chạy phần mềm, nhưng tôi không biết nên đặt các giới hạn này ở đâu trong OS X.

Có một GUI ở đâu đó cho nó? Có một tập tin cấu hình ở đâu đó cho nó? Cách tốt nhất để thay đổi các lo ngại mặc định trên OS X là gì?



Câu trả lời:


27

Theo Leopard quá trình ban đầu là launchd. Các lỗ hổng mặc định của mỗi quá trình được kế thừa từ launchd. Để tham khảo các giới hạn mặc định (được biên dịch) là

$ sudo launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        6291456        unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     266            532            
    maxfiles    256            unlimited

Để thay đổi bất kỳ giới hạn nào trong số này, hãy thêm một dòng (bạn có thể cần tạo tệp trước) /etc/launchd.conf, các đối số giống như được truyền cho launchctllệnh. Ví dụ

echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf

Tuy nhiên, launchdđã bắt đầu shell đăng nhập của bạn, vì vậy cách đơn giản nhất để thực hiện các thay đổi này có hiệu lực là khởi động lại máy của chúng tôi. (Sử dụng >> để thêm vào /etc/launchd.conf.)


2
Bạn có thể thêm một liên kết đến các tài liệu chính thức cho điều này?
Glyph

7
Anh bạn, nếu điều này được ghi lại ở bất cứ đâu, trang này sẽ không cần thiết
Dave Cheney

1
Dường như không hoạt động trên Snow Leopard.
ismail

1
Bất cứ ý tưởng này khác nhau như thế nào sysctl.maxfiles? (câu hỏi liên quan: apple.stackexchange.com/questions/33715/too-many-open-files )
keflavich

2
Chỉnh sửa nhỏ: bạn đang chạy echotheo sudo nhưng đang cố gắng để phần vỏ không có đặc quyền của bạn được thêm vào tệp, điều này không được phép thực hiện. Hãy thử echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.confthay thế.
Vine

4
sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf

không hoạt động vì sudo ở sai vị trí, hãy thử điều này:

echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf

3
Điều này có lẽ sẽ tốt hơn khi một đề xuất chỉnh sửa của người Viking về câu trả lời mà bạn đang đề cập.
Chris Johnsen

3

Giới hạn vỏ

Các tài nguyên có sẵn cho trình bao và các quy trình có thể được thay đổi bằng ulimitlệnh có thể được thêm vào các tập lệnh khởi động như ~/.bashrchoặc ~/.bash_profilecho từng người dùng hoặc /etc/bashrccho tất cả người dùng . Dòng ví dụ để thêm:

ulimit -Sn 4096 && ulimit -Sl unlimited

Xem: help ulimitman bashđể biết thêm thông tin.

Giới hạn hệ thống

Nói chung, giới hạn hệ thống được kiểm soát bởi khung Launchd và có thể được thay đổi bằng launchctllệnh, ví dụ:

launchctl limit maxfiles 10240 unlimited

Để thực hiện các thay đổi liên tục, bạn cần tạo tệp danh sách thuộc tính trong các thư mục tương thích Khởi chạy cụ thể hoạt động như một tác nhân khởi động.

Dưới đây là lệnh ví dụ tạo tập tin khởi động như vậy:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"

Tuy nhiên, tệp sẽ được tải khi khởi chạy hệ thống, để tải để chạy thủ công:

sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist

Để xác minh các giới hạn hiện tại, hãy chạy : launchctl limit.

Xem: Tạo Daemon và Đại lý .

Giới hạn hạt nhân

  • Giới hạn hạt nhân được điều khiển bởi sysctllệnh.
  • Để xem giới hạn kernel hiện tại, hãy chạy : sysctl -a | grep ^kern.max.
  • Để thay đổi tối đa các tệp được phép mở, hãy chạy : sudo sysctl -w kern.maxfiles=20480.
  • Để thực hiện các thay đổi liên tục, sử dụng phương pháp tương tự ở trên để tạo tệp danh sách thuộc tính trong thư mục khởi động hệ thống.

Liên quan:


Phương pháp không dùng nữa

Trong phiên bản macOS trước đó, bạn có thể đặt các giới hạn này trong toàn /etc/sysctl.confhệ thống như bình thường bạn làm trên Unix, tuy nhiên, có vẻ như nó không được hỗ trợ.

Sử dụng ~/.launchd.confhoặc có /etc/launchd.confvẻ như nó cũng không được hỗ trợ trong bất kỳ phiên bản macOS hiện có nào. wiki

Tương tự với /etc/rc.localtệp khởi động, nó không được hỗ trợ trên macOS.


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

Bây giờ tôi phải tìm lý do tại sao tồn tại 2 phương tiện kiểm tra / thiết lập giới hạn ....


Được rồi - có vẻ như ulimitsysctlcho một cảm giác tích cực sai lầm rằng họ thực sự làm một cái gì đó - nhưng thay vào đó họ dường như là vô dụng . Ai đó có thể xác minh điều đó?


Được rồi, tôi bắt đầu hiểu. Kể từ phiên bản v10.4, không còn initquá trình nào nữa, nó đã được thay thế bởi launchd, nó cũng chạy với mức 1 là PID.

% ps -fu root
  UID   PID  PPID   C     STIME TTY           TIME CMD
    0     1     0   0   0:30.72 ??         0:46.72 /sbin/launchd

Và tất nhiên điều đáng nói là đó ulimitlà một shell được tích hợp sẵn, launchctllà một chương trình độc lập với shell.


2

Trên OS X, nếu bạn đang cố gắng sửa đổi các giới hạn mềm cho daemon hoặc tiến trình hoặc tác vụ, cách đúng để thay đổi các giới hạn mềm này không phải là bằng cách thay đổi cấu hình launchd mặc định cho tất cả các quy trình, mà bằng cách đặt nó cho quy trình bạn đang cố gắng chạy

Điều này được thực hiện trong tệp launchd .plist cho quy trình của bạn.

Nếu bạn có một daemon hoặc tiến trình đang chạy mà bạn cần có nhiều tệp đang mở hơn, hãy tạo một tệp plist cho nó và thêm các thông số này vào nó:

    <key>SoftResourceLimits</key>
    <dict>
        <key>NumberOfFiles</key>
        <integer>1024</integer>
    </dict>

Một ví dụ, sử dụng mongodb. Tôi tạo một tệp .plist có tên org.mongo.mongodb.plist và lưu nó vào /L Library / LaunchDaemons / org.mongo.mongodb.plist. Các tập tin trông như thế này:

<?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>Disabled</key>
  <false/>
  <key>Label</key>
  <string>org.mongo.mongod</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/lib/mongodb/bin/mongod</string>
    <string>--dbpath</string>
    <string>/Users/Shared/mongodata/</string>
    <string>--logpath</string>
    <string>/var/log/mongodb.log</string>
  </array>
  <key>QueueDirectories</key>
  <array/>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>daemon</string>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
    <key>NumberOfProcesses</key>
    <integer>512</integer>
  </dict>
</dict>
</plist>

Bây giờ quy trình của bạn có các tài nguyên mà nó cần, mà không cần cấu hình toàn cầu cho hệ thống. Điều này sẽ tự động được thiết lập khi khởi động lại. Hoặc, nếu bạn không muốn khởi động lại, bạn có thể chạy

sudo launchctl load /Library/LaunchDaemons/org.mongod.plist

Nếu quy trình hoặc tác vụ của bạn là của một tác nhân hơn là một daemon, bạn có thể đặt .plist vào / Library / LaunchAgents thay thế. Các quy tắc khác nhau áp dụng cho cách launchd sẽ kiểm soát quá trình của bạn trong cả hai trường hợp. LaunchDaemons dường như dành riêng cho các quy trình mà launchd sẽ cố gắng theo kịp mọi lúc.


1

Sau đây sẽ giải quyết hầu hết các giải pháp (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. ulimit dường như thừa hưởng giá trị 'tệp mở' từ launchctl theo mặc định
  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.
  8. Khi giới hạn launchctl thấp hơn giới hạn sysctl, đã có báo cáo rằng các giới hạn sysctl liên quan sẽ được tự động tăng lên để đáp ứng các yêu cầu.

1

Kinh nghiệm của tôi là nhiệm vụ đếm quá trình cao của tôi chỉ thành công với:

kern.maxproc=2500  # This is as big as I could set it.

kern.maxprocperuid=2048

ulimit -u 2048

Hai cái đầu tiên có thể đi vào /etc/sysctl.confvà giá trị ulimit vào launchd.conf, cho cài đặt đáng tin cậy.

Vì tcp / ip là một phần của những gì tôi đang làm, tôi cũng cần phải tìm ra

kern.ipc.somaxconn=8192

từ 128 mặc định của nó.

Trước khi tôi tăng giới hạn quy trình, tôi đã nhận được các lỗi "fork", không đủ tài nguyên. Trước khi tôi tăng kern.ipc.somaxconn, tôi đã gặp lỗi "hỏng ống".

Điều này là trong khi chạy một số lượng khá lớn (500-4000) các quy trình tách rời trên máy Mac quái vật của tôi, OS 10.5.7, rồi 10.5.8, giờ là 10.6.1. Trong Linux trên máy tính của ông chủ tôi, nó chỉ hoạt động.

Tôi nghĩ rằng số lượng quy trình sẽ gần hơn 1000 nhưng dường như mọi quy trình tôi bắt đầu đều bao gồm bản sao vỏ của chính nó ngoài mục thực tế đang thực hiện công việc thực tế. Rất lễ hội.

Tôi đã viết một món đồ chơi trưng bày giống như:

#!/bin/sh

while[ 1 ]

do

    n=netstat -an | wc -l

    nw=netstat -an | grep WAIT | wc -l

    p=ps -ef | wc -l

    psh=ps -ef | fgrep sh | wc -l

    echo "netstat: $n   wait: $nw      ps: $p   sh: $psh"

    sleep 0.5

done

và xem số lượng tiến trình tối đa trong ps -ef và treo xung quanh trong netstat đang chờ TIME_WAIThết hạn ... Với các giới hạn được nâng lên, tôi đã thấy hơn 3500 TIME_WAITmặt hàng ở mức cao nhất.

Trước khi tôi tăng giới hạn, tôi có thể 'lẻn' lên ngưỡng thất bại, bắt đầu dưới 1K nhưng tăng lên giá trị cao là 1190 .. mỗi lần nó bị đẩy vào thất bại, có thể phải mất thêm một chút nữa vào lần tới, có lẽ vì điều gì đó lưu trữ mở rộng đến giới hạn của nó mỗi khi nó thất bại.

Mặc dù trường hợp thử nghiệm của tôi có "chờ đợi" vì tuyên bố cuối cùng của nó vẫn còn NHIỀU quy trình tách rời treo xung quanh sau khi nó thoát ra.

Tôi đã nhận được hầu hết các thông tin tôi sử dụng từ các bài đăng trên internet, nhưng không phải tất cả đều chính xác. Milage của bạn có thể thay đổi.

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.