3

Authorization Services の「AuthorizationExecuteWithPrivileges」呼び出しを通じて、root/admin 特権で実行されるシェル コマンドが大量にあります。問題は、しばらくすると (10 ~ 15 秒、おそらく 100 個のシェル コマンド)、デバッガーで次のエラーが表示されてプログラムが応答を停止することです。

フォークできませんでした: errno 35

そして、アプリの実行中は、それ以上アプリケーションを起動できません。この問題を調査したところ、システムが使用できるスレッドがこれ以上ないことを意味しているようです。ただし、Activity Monitor を使用して確認したところ、アプリは 4 ~ 5 スレッドしか使用していません。

この問題を解決するには、シェル コマンドを (メイン スレッドから離れた) 別のスレッドに分離する必要があると思います。これまでスレッド化を使用したことがなく、どこから始めればよいかわかりません (包括的な例を見つけることができませんでした)

ありがとう

4

2 に答える 2

7

Louis Gerbargがすでに指摘しているように、あなたの質問はスレッドとは何の関係もありません。それに応じてあなたのタイトルとタグを編集しました。

AuthorizationServicesの「AuthorizationExecuteWithPrivileges」呼び出しを介してroot/admin特権で実行されているシェルコマンドが大量にあります。

そうしないでください。この関数は、root:adminの所有権とsetuidモードビットをrootとして実行するツールに復元できるようにするためにのみ存在します。

ルートとして実行する必要のあるコードを、ルートとして実行する必要のない部分とは完全に別のプログラムに分解して、ルートを必要とする部分が(setuidビットを介して)それを持つことができるようにするという考え方です。 rootを必要としない部分は、rootなしで実行できます(setuidがないため)。

コード例は、AuthorizationServicesプログラミングガイドにあります。

問題は、しばらくすると(10〜15秒、おそらく100個のシェルコマンド)、プログラムがデバッガーでこのエラーで応答を停止することです。

couldn't fork: errno 35

うん。一度に実行できるプロセスは数百にすぎません。これはOSによって強制される制限です。

これはソフト制限です。つまり、引き上げることができますが、引き上げることができないハード制限までしか引き上げることができません。limitandの出力を参照してくださいlimit -h(zshで;他のシェルについてはわかりません)。

さらにプロセスを実行する前に、プロセスが終了するのを待つ必要があります。

そして、アプリの実行中は、これ以上アプリケーションを起動できません。

許可されている数のプロセスをすでに実行しているためです。そのx百プロセスの制限は、プロセスごとではなく、ユーザーごとです。

私はこの問題を調査しましたが、システムで使用できるスレッドがこれ以上ないことを意味しているようです。

いいえ、違います。

errnoエラーコードは多くのことに使用されます。EAGAIN(35、「リソースが一時的に利用できません」)は、スレッドを開始するシステムコールによって設定されたときにスレッドがなくなることを意味する場合がありますが、別のシステムコールまたは関数によって設定されたときにそれを意味するわけではありません。

引用したエラーメッセージは、それがによって設定されたことを明示的に示しています。これは、新しいスレッドではなく、新しいプロセスforkを開始するためのシステムコールです。その文脈では、「あなたはすでにできるだけ多くのプロセスを実行している」という意味です。フォークのマンページを参照してください。EAGAIN

ただし、Activity Monitorを使用して確認したところ、アプリは4〜5スレッドしか使用していません。

見る?

この問題を解決するには、シェルコマンドを(メインスレッドから離れた)別のスレッドに分離する必要があると思います。

スレッドごとに1つのプロセスを開始すると、プロセスがはるかに速く不足するのに役立ちます。

私はこれまでスレッドを使用したことがありません…</p>

参照している関数がスレッドではなくプロセスを開始するため、まだ行っていないようです。

于 2009-08-23T05:02:39.557 に答える
3

これはスレッドに関するものではありません (少なくともアプリケーション内のスレッドではありません)。これはシステム リソースに関するものです。これらのフォークされた各プロセスは、少なくとも 1 つのカーネル スレッド (場合によってはそれ以上)、いくつかの vnode、およびその他の多くのものを消費しています。最終的に、システムはそれ以上のプロセスを生成することを許可しなくなります。

最初にぶつかる制限は管理上の制限です。システムはより多くをサポートできますが、パフォーマンスの低下やその他の問題が発生する可能性があります。通常、sysctl などのさまざまなメカニズムを通じてこれらを発生させることができます。一般に、特定の微調整の恩恵を受けることがわかっている特定の (特別な) ワークロードがない限り、これを行うのは悪い考えです。

これらの制限を引き上げても、問題が解決しない可能性があります。これらの制限を調整すると、実行時間が少し長くなる可能性がありますが、実際に修正するには、リソースがシステムに返されない理由を突き止める必要があります。上記の説明に基づいて、フォークされたプロセスは決して終了しないと思います。

于 2009-08-23T04:12:30.330 に答える