GNU / Linux는 프로세스와 스레드 수를 제한 할 때 함께 계산합니까?


11

내 컴퓨터에서 사용자 당 프로세스 수 /etc/security/limits.conf와 nproc 값 을 제한하고 싶습니다 .

나는 읽고 여기에 리눅스는 프로세스와 스레드를 구별 나던 것을?

사용자 당 현재 nproc 제한은 1024이지만 스레드도 포함하면 내 관점에서 너무 낮습니다. 맨 페이지에는 limits.confnproc에 대한 "process"만 언급되어 있으며 다른 내용은 없습니다.

// Edit // 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 또는 더 넓은 관점에서 리눅스 는 프로세스와 스레드를 구별하지 않습니다. 스레드는 프로세스뿐만 아니라 소진 될 수 있기 때문에 나에게 합리적인 것 같습니다.

답변:


14

nproc당신이 이야기 하는 한계는 실행 가능한 엔티티 에 적용 되므로 스레드를 제한합니다 (따라서 스레드를 포함하는 프로세스) . 모든 프로세스에는 하나 이상의 스레드 (1 차 스레드)가 있으므로 스레드 만 실행할 수 있습니다 . 엄밀히 말하면 프로세스는 "실행 가능"하지 않습니다.

이 답변 은 Linux에서 스레드와 프로세스의 실제 차이점을 설명합니다.

나는 코드 테스트 다야 의 대답 (도 추가 sleep(1);(?!)이 : 너무 많은 스레드가 생성되었을 때, 나는 한계를 명중 스레드 코드에서) 그와는 달리 pthread_create()반환되었다 EAGAIN. pthread_create(3)문서는이 오류에 대한 다음 말한다 :

EAGAIN

다른 스레드를 작성하기위한 자원이 부족하거나 스레드 수에 대한 시스템 제한이 발생했습니다. 후자의 경우 두 가지 방식으로 발생할 수 있습니다. 실제 사용자 ID의 프로세스 수를 제한하는 RLIMIT_NPROC 소프트 자원 제한 (setrlimit (2)를 통해 설정)에 도달했습니다. 또는 스레드 수 / proc / sys / kernel / threads-max에 대한 커널의 시스템 전체 한계에 도달했습니다.

내가 언급 볼 특정 에 당 스레드 한계를 커널 소스 난 단지보고, RLIMIT_NPROC당신이 변경할 수있는 한계 인이 limits.conf(함께가 nproc), ulimit -usetrlimit(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 ()에 필요한 다른 시간이 있으면 코드가 실패합니다.
피터 웨버

글쎄, test ()에 while (1) {}을 추가했지만 여전히 위와 동일한 결과를 얻습니다.
daya

요청을 수정했습니다. 내 코드도 테스트 할 수 있습니다. 첫 번째 답변 "예. 리눅스 시스템은 POSIX 스레드와 프로세스를 함께 계산합니다"는 완벽하게 보입니다.
피터 웨버

그렇습니다. 프로그램에서 시도 할 때까지 생각했습니다.
daya

2
나는 당신의 결론에 동의하지 않습니다 . 프로그램을 시도했을 때 너무 많은 스레드가 생성되면 한계에 도달했습니다. Linux 제한 스레드에 적용됩니다. 내 답변을 참조하십시오 .
Totor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.