GNU / Linuxは、プロセスとスレッドの数を制限すると、それらを一緒にカウントしますか?


11

マシン上のユーザーごとのプロセス数を/etc/security/limits.conf、nproc値で制限したい。

Linuxはプロセスとスレッドを区別しないことをここで読みましたか?

ユーザーごとの現在のnproc制限は1024ですが、これにスレッドも含まれる場合、私の観点では低すぎます。のマンページではlimits.conf、nprocの「プロセス」についてのみ言及しており、他には何も言及していません。

// Boostを使用してC ++でサンプルコードを編集// g ++ -o boost_thread boost_thread.cpp -lboost_thread

#include <unistd.h>
#include <iostream>
#include <boost/thread.hpp>
using namespace std;

int counter;

void print_thread(int i) {
    counter++;
    cout << "thread(" << i << ") counter " << counter << "\n";
    sleep(5);
    counter--;
}

int main() {
    int i = 0;
    int max = 1000000;

    while (i < max) {
        boost::thread(print_thread, i);
        i++;
    }

    return 0;
}

テスト(一部の行を削除):

$ ulimit -u
1024
$ ./thread 
...
...
...
thread(828) counter 828
thread(829) counter 829
thread(830) counter 830
thread(831) counter 831
thread(832) counter 832
thread(610) counter thread(833833) counter 834

thread(834) counter 835
thread(835) counter 836
thread(836) counter 837
thread(837) counter 838
thread(838) counter 839
thread(839) counter 840
thread(840) counter 841
thread(841) counter 842
thread(842) counter 843
thread(843) counter 844
thread(844) counter 845
thread(845) counter 846
thread(846) counter 847
thread(847) counter 848
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> >'
  what():  boost::thread_resource_error
Aborted (core dumped)

私のラップトップはアイドル状態の間に〜130プロセスを使用します。したがって、nproc、またはより広い視野でのLinuxは、プロセスとスレッドを区別しません。スレッドもプロセスだけでなく使い果たされる可能性があるため、これは私には理にかなっているようです。

回答:


14

nprocあなたが話している制限が適用される実行可能なエンティティ、それはこのように、スレッド(およびそれらを含むので、プロセス)を制限しています。すべてのプロセスには少なくとも1つのスレッド(プライマリスレッド)があるため、スレッドのみを実行できます。厳密に言えば、プロセスは「実行可能」ではありません。

この回答は、Linuxにおけるスレッドとプロセスの実際の違いを説明しています。

私は、内のコードをテストしたダヤの答えを(も追加sleep(1);スレッドコードで)、あまりにも多くのスレッドが作成されたとき、彼とは違って、私は限界に達し(?!):pthread_create()返していましたEAGAINpthread_create(3)ドキュメントには、このエラーについて次のことを言います。

EAGAIN

別のスレッドを作成するためのリソースが不十分であるか、またはスレッド数のシステムによる制限が発生しました。後者のケースは2つの方法で発生する可能性があります。実際のユーザーIDのプロセス数を制限するRLIMIT_NPROCソフトリソース制限(setrlimit(2)で設定)に達した。または、スレッド数/ proc / sys / kernel / threads-maxに関するカーネルのシステム全体の制限に達した。

私はには言及見ない特定にスレッドごとの制限をカーネルソース私は見、RLIMIT_NPROCあなたが変更することができます制限されており、そこにlimits.conf(でnproc)、ulimit -uまたはsetrlimit(2)


0

ulimitはプロセス数のみを制限します。したがって、値セットを使用して

ulimit -u 1024

プロセスの数を制限します。

eg.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* test(void *ptr){
   return 0;
}



int main()
{
        pthread_t thread[50];
        int i=0;

      for(i=0;i<50;i++){
      if(!pthread_create( &thread[i], NULL,test,NULL))
         printf("%d ",i);

       }


      for(i=0;i<50;i++)
       pthread_join( thread[i], NULL);
       return 0;
}

ulimitを設定してチェックする

lab@x:/tmp$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
lab@x:/tmp$ 
lab@x:/tmp$ 
lab@x:~$ cd /home/x
lab@x:/home/x$ ./thread 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 lab@x:/home/x$ 
lab@x:/home/x$ 
lab@x:/home/x$ ulimit -u 10
lab@x:/home/x$ 

プロセス制限は10に設定されています

lab@x:/home/x$ ./thread 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 lab@x:/home/x$ 
lab@x:/home/x$ 

ここでは50のスレッドを作成できます。


3
一見するとコードと理論的根拠は正しいように見えますが、コードと理論的根拠が間違っていると思います。スレッドはすぐに戻りますが、sleep(5)またはtest()で必要な他の時間があれば、コードは失敗するはずです。
Peter Weber

まあ、私はtest()にwhile(1){}を追加しましたが、それでも上記と同じ結果が得られます。
daya

リクエストを編集しました。私のコードもテストできます。最初の答え「はい、LinuxシステムはPOSIXスレッドとプロセスを一緒にカウントします」は完全に正しいように見えます。
Peter Weber

はい、それは私がプログラムでそれを試してみるまで私が考えたことです。
Daya

2
あなたの結論に同意しません。プログラムを試してみたところ、作成されたスレッドが多すぎると制限に達しました。Linuxの制限スレッドに適用されます。私の答えをください。
Totor 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.