4

私のアプリケーションは接続スレッドごとに作成します。ゼロ以外のユーザー ID でアプリケーションが破壊され、スレッド数がデフォルト値の 1024 を超えることがあります。この番号を編集したいので、選択肢がほとんどありません

ルートとして実行 [非常に悪い考えであり、セキュリティについても妥協する必要があるため、削除する]

特権のないユーザーの下で実行するにはsetcapを使用し、機能CAP_SYS_RESOURCEを付与します。次に、プログラムにコードを追加できます

      struct rlimit rlp; /* will initilize this later with values of nprocs(maximum number of desired threads)*/
      setrlimit(RLIMIT_NPROC, &rlp);
      /*RLIMIT_NPROC
      *The maximum number of processes (or, more precisely on Linux, threads) that can      
      * created for the real user ID of the
      *calling process.  Upon encountering this limit, fork(2) fails with the error
      *EAGAIN. */

他には/etc/securitylimits.confを編集することです 。ここで、開発ユーザーのエントリを作成して、たとえば行を入れることができます

            @devuser        hard    nproc           20000
            @devuser        soft    nproc           10000

ここで、10k で十分です。したがって、ソース コードを変更することに少し気が進まないので、最後のオプションに進む必要があります。そして、私はより堅牢で標準的なアプローチが何であるかを知りたいと思っています。

ご意見をお待ちしております。よろしくお願いします:)

PS: 1 つのプロセスが 1,000 を超えるスレッドで処理される場合はどうなりますか。もちろん、私は32GBのRAMも持っています

4

1 に答える 1

3

まず、1,000 近くのスレッドがあるという点で、あなたは間違っていると思います。スレッドは非常にコストがかかり、通常、それほど多くのスレッドを持つことは合理的ではありません。せいぜい数ダースのスレッドを持つことをお勧めします (非常に高価なスーパーコンピューターで実行しない限り)。

poll(2)のような多重化システムコールの周りにいくつかのイベントループを持つことができます。そうすれば、1 つのスレッドで何千もの接続を処理できます。C10K 問題epollについて読んでください。libeventlibevなどのイベント ライブラリの使用を検討してください。

root としてアプリケーションを起動し (おそらくsetuid手法を使用して)、必要なリソースをセットアップし (特に、特権 TCP/IP ポートを開く)、setreuid(2)でユーザーを変更できます。

高度な Linux プログラミングを読む...

setrlimit(2)を使用して制限を増やし、でユーザーを変更し、setreuid最後に実際のプログラムをexecve(2)する小さな setuid C プログラムの周りにアプリケーションをラップすることもできます 。

于 2014-02-11T12:14:00.543 に答える