Limite de 613 threads no debian

Limite de 613 threads no debian

Ao executar este programalimite de thread.cno meu servidor Debian dedicado, a saída diz que meu sistema não pode criar mais do que cerca de 600 threads. Preciso criar mais threads e corrigir a configuração incorreta do meu sistema.

Aqui estão algumas informações sobre meu servidor dedicado:

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

Aqui está a saída do programa 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.

Alguma idéia de como consertar isso, por favor?

Responder1

Você não precisa criar mais de 600 threads por vez. Você só precisa de threads para coisas que pode fazer de forma útil ao mesmo tempo. Seu sistema não pode fazer mais de 600 coisas de forma útil ao mesmo tempo. Você não precisa de mais threads para fazer mais trabalho.

De qualquer forma, você está definindo o tamanho da pilha errado. Você está definindo o tamanho limite da pilha de threads inicial, aquela não criada pelo seu código. Você deveria definir o tamanho da pilha de threads que seu código cria.

Mudar:

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

para (aproximadamente):

  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);

Você também pode ligar pthread_attr_getstacksizepara saber o tamanho da pilha de threads padrão da sua plataforma. Observe que se um thread exceder sua pilha alocada, seu processo morrerá.

Mesmo com uma pilha de 2 MB, o que pode ser muito perigoso, você ainda está olhando para 1,2 GB apenas para pilhas com 600 threads. Seja qual for o seu trabalho, os threads não são a ferramenta certa para isso.

Responder2

Isso não tem nada a ver com limites de thread. O código de erro 12 não se aplica aos limites de thread.

$ perror 12
OS error code  12:  Cannot allocate memory

Eu acho que se alguma coisa estiver com pouca pilha, se você configurá-lo para o padrão redhat de 8 MB, provavelmente será capaz de executar mais threads.

Este é o mesmo vinculado com tamanhos de pilha explícitos definidos como 8 MB. Veja o que acontece quando você compila este.

/* 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);
}

Responder3

Acabei de receber a seguinte informação: Esta é uma limitação imposta pelo meu provedor de hospedagem. Isso não tem nada a ver com programação ou Linux.

informação relacionada