OS X(10.5)で指定されているデフォルトのulimitはどこにありますか?


26

nofileOS Xユーザーアカウントのデフォルトの制限は、最近では約256個のファイル記述子であるようです。一度に開くよりも多くの接続を必要とするソフトウェアをテストしようとしています。

pam制限モジュールを実行している典型的なDebianボックス/etc/security/limits.confでは、ソフトウェアを実行するユーザーに対してより高い制限を設定するように編集しますが、OS Xでこれらの制限を設定する場所はわかりません。

それのためのGUIはどこかにありますか?構成ファイルはどこかにありますか?OS Xでデフォルトのulimitを変更する最も簡単な方法は何ですか?


Mac OS X Lionについては、superuser.com
David J.

回答:


27

Leopardでは、初期プロセスはlaunchdです。各プロセスのデフォルトのulimitsはから継承されlaunchdます。参考のために、デフォルト(コンパイル済み)の制限は次のとおりです。

$ 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

これらの制限のいずれかを変更するには、行を追加し(最初にファイルを作成する必要がある場合があります)/etc/launchd.conf、引数はlaunchctlコマンドに渡されるものと同じです。例えば

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

ただしlaunchd、ログインシェルはすでに開始されているため、これらの変更を有効にする最も簡単な方法は、マシンを再起動することです。(>>を使用して/etc/launchd.confに追加します。)


2
このための公式ドキュメントへのリンクを追加できますか?
グリフ

7
おい、これどこか文書化されていれば、このページは必要ないだろう
デイブチェイニー

1
Snow Leopardでは動作しないようです。
イスマイル

1
これがどのように違うのsysctl.maxfilesか?(関連質問:apple.stackexchange.com/questions/33715/too-many-open-files
keflavich

2
わずかな修正:echosudoで実行していますが、権限のないシェルをファイルに追加しようとしていますが、これは許可されていません。echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf代わりに試してください。
ビニート

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

sudoが間違った場所にあるため機能しません。これを試してください:

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

3
これは、おそらくあなたが参照している答えに対する「提案された編集」としてより良いでしょう。
クリスジョンセン

3

シェル制限

シェルやプロセスが利用できるリソースはによって変更することができるulimitなどの起動スクリプトに追加することができるコマンド~/.bashrcまたは~/.bash_profile個々のユーザーのために、または/etc/bashrcすべてのユーザーのために。追加する行の例:

ulimit -Sn 4096 && ulimit -Sl unlimited

参照:help ulimitおよびman bash詳細については。

システム制限

一般に、システムの制限はLaunchdフレームワークによって制御され、launchctlコマンドによって変更できます。たとえば、

launchctl limit maxfiles 10240 unlimited

変更を永続的にするには、起動エージェントとして機能する特定の起動準拠フォルダーにプロパティリストファイルを作成する必要があります

このようなスタートアップファイルを作成するコマンドの例を次に示します。

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"

ただし、ファイルはシステムの起動時にロードされ、手動で実行するためにロードされます。

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

現在の制限を確認するには、次を実行しますlaunchctl limit

参照:起動デーモンと起動エージェントの作成

カーネルの制限

  • カーネルの制限は、sysctlコマンドによって制御されます。
  • 現在のカーネルの制限を確認するには、次を実行しますsysctl -a | grep ^kern.max
  • 開くことができるファイルの最大数を変更するには、次を実行しますsudo sysctl -w kern.maxfiles=20480
  • 変更を永続的にするには、上記の同様の方法を使用して、システムスタートアップフォルダーにプロパティリストファイルを作成します。

関連:


非推奨のメソッド

macOSの以前のバージョンで/etc/sysctl.confは、Unixで通常行うようにシステム全体でこれらの制限を設定できましたが、サポートされていないようです。

を使用している~/.launchd.conf/etc/launchd.conf、既存のmacOSのバージョンでもサポートされていないようです。ウィキ

/etc/rc.localスタートアップファイルと同じですが、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
%

今、私は制限をチェック/設定する2つの手段が存在する理由を見つける必要があります。


大丈夫-のように思えるulimitし、sysctl彼らが実際に何かをすることを偽陽性の感覚を与える-代わりに彼らがあるように見える役に立ちません。誰かがそれを確認できますか?


さて、私は理解し始めています。v10.4の時点では、initプロセスはなくlaunchdなりました。PIDが1で実行されるに置き換えられました。

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

そしてもちろん言及する価値があるのulimitは、組み込みのシェルでlaunchctlあり、シェルに依存しないプログラムです。


2

OS Xでは、デーモン、プロセス、またはタスクのソフト制限を変更しようとする場合、これらのソフト制限を変更する正しい方法は、すべてのプロセスのデフォルトのlaunchd構成を変更することではなく、プロセスに設定することです実行しようとしています。

これは、プロセスのlaunchd .plistファイルで実行されます。

デーモンまたはプロセスを実行していて、さらに開いているファイルが必要な場合は、plistファイルを作成し、これらのパラメーターを追加します。

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

例、mongodbを使用します。org.mongo.mongodb.plistという.plistファイルを作成し、/ Library / LaunchDaemons / org.mongo.mongodb.plistに保存します。ファイルは次のようになります。

<?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>

これで、システムのグローバル構成をいじることなく、プロセスに必要なリソースが用意されました。これは再起動時に自動的に設定されます。または、再起動したくない場合は、実行することができます

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

プロセスまたはタスクがデーモンよりもエージェントの場合、代わりに.plistを/ Library / LaunchAgentsに配置できます。どちらの場合でも、launchdがプロセスを制御する方法にはさまざまなルールが適用されます。LaunchDaemonsは、launchdが常に維持しようとするプロセス用に予約されているようです。


1

以下はほとんどのソリューションを解決するはずです(そしてそれらの階層の順にリストされています):

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

ノート:

  1. これらの変更を有効にするには、再起動する必要があります。
  2. 知っている限り、OS Xで制限を「無制限」に設定することはできません
  3. launchctl maxfilesはsysctl maxfilesによって制限されているため、それらを超えることはできません
  4. sysctlはlaunchctl maxfilesからkern.maxfilesperprocを継承しているようです
  5. ulimitはデフォルトでlaunchctlから「ファイルを開く」値を継承しているようです
  6. / etc / profileまたは〜/ .profile内でカスタムulimitを設定できます。これは必須ではありませんが、例を提供しました
  7. これらの値をデフォルトと比較して非常に高い値に設定する場合は注意してください-機能には安定性/セキュリティがあります。他のウェブサイトに書かれた、合理的であると思われるこれらのサンプル番号を採用しました。
  8. launchctlの制限がsysctlの制限よりも低い場合、関連するsysctlの制限が要件を満たすために自動的に引き上げられるという報告がありました。

1

私の経験では、プロセス数の多いタスクは次の場合にのみ成功しました。

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

kern.maxprocperuid=2048

ulimit -u 2048

/etc/sysctl.conf信頼できる設定のために、最初の2つを入力し、ulimit値をlaunchd.confに入力できます。

tcp / ipは私がやっていることの一部だったので、バンプアップする必要もありました

kern.ipc.somaxconn=8192

デフォルトの128から。

プロセスの制限を増やす前に、十分なリソースではなく「フォーク」エラーが発生していました。kern.ipc.somaxconnを増やす前に、「パイプ破損」エラーが発生していました。

これは、モンスターMac、OS 10.5.7、そして10.5.8、現在10.6.1でかなりの数(500-4000)の切り離されたプロセスを実行しているときでした。私の上司のコンピューター上のLinuxの下ではうまくいきました。

プロセスの数は1000に近いと思いましたが、実際に作業を行っている実際のアイテムに加えて、私が開始したすべてのプロセスにはシェルの独自のコピーが含まれているようです。とてもお祭り。

私は次のようなもののディスプレイおもちゃを書きました:

#!/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

ps -efでプロセスの最大数を監視し、TIME_WAIT有効期限が切れるのを待っているnetstatでぶらぶらしています...制限を引き上げると、3500以上のTIME_WAITアイテムがピークに達しました。

制限を上げる前に、1K未満から始まって1190の高い値に上がった障害のしきい値を「忍び寄る」ことができました。障害にプッシュされるたびに、おそらく何かのために、もう少し時間がかかる可能性があります失敗するたびにその限界まで拡張されたキャッシュ。

私のテストケースには最終ステートメントとして「待機」がありましたが、終了後も多くの切り離されたプロセスがぶらぶらしています。

私はインターネットでの投稿から使用した情報の大部分を入手しましたが、すべてが正確であったわけではありません。走行距離は異なる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.