데비안의 스레드 제한은 613개입니다.

데비안의 스레드 제한은 613개입니다.

이 프로그램을 실행할 때스레드 제한.c내 전용 데비안 서버에서 내 시스템이 약 600개 이상의 스레드를 생성할 수 없다고 출력됩니다. 더 많은 스레드를 생성하고 시스템 구성 오류를 수정해야 합니다.

내 전용 서버에 대한 몇 가지 정보는 다음과 같습니다.

de801:/# uname -a
Linux de801.ispfr.net 2.6.18-028stab085.5 #1 SMP Thu Apr 14 15:06:33 MSD 2011 x86_64 GNU/Linux
de801:/# java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
de801:/# ldd $(which java)
        linux-vdso.so.1 =>  (0x00007fffbc3fd000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00002af013225000)
        libjli.so => /usr/lib/jvm/java-6-sun-1.6.0.26/jre/bin/../lib/amd64/jli/libjli.so (0x00002af013441000)
        libdl.so.2 => /lib/libdl.so.2 (0x00002af01354b000)
        libc.so.6 => /lib/libc.so.6 (0x00002af013750000)
        /lib64/ld-linux-x86-64.so.2 (0x00002af013008000)
de801:/# cat /proc/sys/kernel/threads-max
1589248
de801:/# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 794624
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 128
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

다음은 C 프로그램의 출력입니다.

de801:/test# ./thread-limit
Creating threads ...
Address of c = 1061520 KB
Address of c = 1081300 KB
Address of c = 1080904 KB
Address of c = 1081168 KB
Address of c = 1080508 KB
Address of c = 1080640 KB
Address of c = 1081432 KB
Address of c = 1081036 KB
Address of c = 1080772 KB
100 threads so far ...
200 threads so far ...
300 threads so far ...
400 threads so far ...
500 threads so far ...
600 threads so far ...
Failed with return code 12 creating thread 637.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변1

한 번에 600개 이상의 스레드를 생성할 필요는 없습니다. 동시에 유용하게 수행할 수 있는 작업에만 스레드가 필요합니다. 귀하의 시스템은 한 번에 600개 이상의 작업을 유용하게 수행할 수 없습니다. 더 많은 작업을 수행하기 위해 더 많은 스레드가 필요하지 않습니다.

어쨌든 잘못된 스택 크기를 설정하고 있습니다. 코드에서 생성되지 않은 초기 스레드 스택의 제한 크기를 설정하고 있습니다. 코드가 생성하는 스레드 스택의 크기를 설정해야 합니다.

변화:

  printf("Creating threads ...\n");
  for (i = 0; i < MAX_THREADS && rc == 0; i++) {
    rc = pthread_create(&(thread[i]), NULL, (void *) &run, NULL);

(대략):

  printf("Creating threads ...\n");
  pthread_attr_t pa;
  pthread_attr_init(&pa);
  pthread_attr_setstacksize(&pa, 2*1024*1024);
  for (i = 0; i < MAX_THREADS && rc == 0; i++) {
    rc = pthread_create(&(thread[i]), &pa, (void *) &run, NULL);
  phtread_attr_destroy(&pa);

pthread_attr_getstacksize또한 호출하여 플랫폼의 기본 스레드 스택 크기를 확인할 수도 있습니다 . 스레드가 할당된 스택을 초과하면 프로세스가 종료됩니다.

매우 위험할 수 있는 2MB 스택을 사용하더라도 스택에 600개의 스레드가 있는 경우에만 1.2GB가 필요합니다. 귀하의 직업이 무엇이든 스레드는 이에 적합한 도구가 아닙니다.

답변2

이는 스레드 제한과 관련이 없습니다. 오류 코드 12는 스레드 제한에 적용되지 않습니다.

$ perror 12
OS error code  12:  Cannot allocate memory

스택이 부족한 경우 Redhat 기본값인 8MB로 설정하면 더 많은 스레드를 실행할 수 있을 것입니다.

이는 명시적 스택 크기가 8MB로 설정된 링크와 동일합니다. 이것을 컴파일하면 어떤 일이 일어나는지 확인하세요.

/* compile with:   gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/time.h>
#include <sys/resource.h>

#define MAX_THREADS 10000
int i;

void run(void) {
  char c;
  if (i < 10)
    printf("Address of c = %u KB\n", (unsigned int) &c / 1024);
  sleep(60 * 60);
}

int main(int argc, char *argv[]) {
  struct rlimit limits;
  limits.rlim_cur = 1024*1024*8;
  limits.rlim_max = 1024*1024*8;
  if (setrlimit(RLIMIT_STACK, &limits) == -1) {
    perror("Failed to set stack limit");
    exit(1);
  }
  int rc = 0;
  pthread_t thread[MAX_THREADS];
  printf("Creating threads ...\n");
  for (i = 0; i < MAX_THREADS && rc == 0; i++) {
    rc = pthread_create(&(thread[i]), NULL, (void *) &run, NULL);
    if (rc == 0) {
      pthread_detach(thread[i]);
      if ((i + 1) % 100 == 0)
    printf("%i threads so far ...\n", i + 1);
    }
    else
      printf("Failed with return code %i creating thread %i.\n",
         rc, i + 1);
  }
  exit(0);
}

답변3

방금 다음 정보를 얻었습니다. 이는 호스트 공급자가 부과한 제한 사항입니다. 이것은 프로그래밍이나 리눅스와는 아무 관련이 없습니다.

관련 정보