OS Xユーザーアカウントのデフォルトのnofile
制限は、最近では約256ファイル記述子のようです。一度に開くよりも多くの接続が必要なソフトウェアをテストしようとしています。
Pam制限モジュールを実行している典型的なDebianボックスでは、/etc/security/limits.conf
を編集して、ソフトウェアを実行するユーザーに対してより高い制限を設定しますが、OS Xでこれらの制限をどこに設定するかがわかりません。
GUIはどこにありますか?どこかに設定ファイルがありますか? OS Xでデフォルトのulimitを変更する最も簡単な方法は何ですか?
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に追加します。)
Sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf
sudoが間違った場所にあるため機能しません、これを試してください:
echo 'limit maxfiles 10000 unlimited' | Sudo tee -a /etc/launchd.conf
シェルおよびプロセスで使用可能なリソースは、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ではサポートされていません。
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が常に追いつこうとするプロセスのために予約されているようです。
% 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
はシェルに依存しないプログラムであることです。
以下は、ほとんどの解決策を解決するはずです(階層の順にリストされています)。
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
ノート:
私の経験では、プロセス数の多いタスクは次の場合にのみ成功しました。
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の高い値に上昇した障害のしきい値を「こっそり」上げることができました。障害が発生するたびに、おそらく何かが原因で、もう少し時間がかかる可能性があります。失敗するたびにその上限まで拡張されたキャッシュ。
私のテストケースの最後のステートメントには「待機」がありましたが、終了した後も、分離されたプロセスがたくさん残っていました。
使用した情報のほとんどはインターネット上の投稿から入手しましたが、すべてが正確であったわけではありません。あなたの走行距離は異なる場合があります。