web-dev-qa-db-ja.com

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

/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の広い視野では、区別されませんプロセスとスレッドの間。プロセスだけでなくスレッドも使い果たされる可能性があるため、これは私には合理的と思われます。

11
Peter Weber

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

この回答 Linuxのスレッドとプロセスの本当の違いを説明しています。

dayaの回答でコードをテストし(スレッドコードにsleep(1);も追加)、彼とは異なり(?!)、多すぎると制限に達しましたスレッドが作成されました:pthread_create()EAGAINを返していました。 pthread_create(3)のドキュメントには、このエラーについて次のように記載されています。

EAGAIN

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

カーネルソース特定のスレッドごとの制限についての言及はありません。そこには_RLIMIT_NPROC_しか表示されません。 _limits.conf_(nprocを使用)、_ulimit -u_、またはsetrlimit(2)で変更できます。

14
Totor

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個のスレッドを作成できます。

0
daya