web-dev-qa-db-ja.com

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

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

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

GUIはどこにありますか?どこかに設定ファイルがありますか? OS Xでデフォルトのulimitを変更する最も簡単な方法は何ですか?

26
archaelus

Leopardでは、最初のプロセスはlaunchdです。各プロセスのデフォルトのulimitは、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に追加します。)

27
Dave Cheney
Sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf

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

echo 'limit maxfiles 10000 unlimited' | Sudo tee -a /etc/launchd.conf
4
andi

シェル制限

シェルおよびプロセスで使用可能なリソースは、ulimitコマンドで変更できます。これは、個々のユーザーの~/.bashrcまたは~/.bash_profileなどの起動スクリプトに追加できます。 または/etc/bashrc for all users。追加する行の例:

ulimit -Sn 4096 && ulimit -Sl unlimited

詳細については、help ulimitおよびman bashを参照してください。

システム制限

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

launchctl limit maxfiles 10240 unlimited

変更を永続化するには、特定の Launch compatible folder にプロパティリストファイルを作成し、スタートアップエージェントとして機能させる必要があります。

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

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では、UNIXで通常行うように、/etc/sysctl.confシステム全体でこれらの制限を設定できましたが、サポートされていないようです。

~/.launchd.confまたは/etc/launchd.confの使用は、macOSの既存のバージョンでもサポートされていないようです。wiki

/etc/rc.localスタートアップファイルと同じですが、macOSではサポートされていません。

4
kenorb

OS Xでは、デーモン、プロセス、またはタスクのソフト制限を変更しようとしている場合、これらのソフト制限を変更する正しい方法は、allプロセスのデフォルトの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が常に追いつこうとするプロセスのために予約されているようです。

2
apotek
% 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つの方法がある理由を見つけなければなりません。


わかりました-ulimitsysctlは実際に何かをしているという偽陽性の感覚を与えるようですが、代わりに役に立たないのようです。誰かがそれを確認できますか?


わかりました。理解し始めました。 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
Xerxes

以下は、ほとんどの解決策を解決するはずです(階層の順にリストされています)。

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. AFAIK、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
errant.info

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

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

kern.maxprocperuid=2048

ulimit -u 2048

最初の2つは/etc/sysctl.confおよび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でプロセスの最大数を監視し、netstatでTIME_WAIT期限切れ...制限が引き上げられ、3500以上が表示されましたTIME_WAITピーク時のアイテム。

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

私のテストケースの最後のステートメントには「待機」がありましたが、終了した後も、分離されたプロセスがたくさん残っていました。

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

1
Bil Abbott