Límite de 613 subprocesos en Debian

Límite de 613 subprocesos en Debian

Al ejecutar este programalímite de hilo.cen mi servidor Debian dedicado, el resultado dice que mi sistema no puede crear más de alrededor de 600 subprocesos. Necesito crear más hilos y arreglar la mala configuración de mi sistema.

Aquí hay algunas informaciones sobre mi 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

Aquí está el resultado del 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.

¿Alguna idea de cómo solucionar este problema, por favor?

Respuesta1

No es necesario crear más de 600 subprocesos a la vez. Sólo necesitas hilos para cosas que puedas hacer de forma útil al mismo tiempo. Su sistema no puede hacer más de 600 cosas a la vez de manera útil. No necesitas más hilos para hacer más trabajo.

En cualquier caso, estás configurando el tamaño de pila incorrecto. Estás configurando el tamaño límite de la pila de subprocesos inicial, el que no crea tu código. Se supone que debes establecer el tamaño de la pila de los subprocesos que crea tu código.

Cambiar:

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

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

También puede llamar pthread_attr_getstacksizepara conocer el tamaño de pila de subprocesos predeterminado de su plataforma. Tenga en cuenta que si un hilo excede su pila asignada, su proceso morirá.

Incluso con una pila de 2 MB, que puede ser muy peligrosa, todavía estás buscando 1,2 GB solo para que las pilas tengan 600 subprocesos. Cualquiera que sea su trabajo, los hilos no son la herramienta adecuada para ello.

Respuesta2

Esto no tiene nada que ver con los límites de los hilos. El código de error 12 no se aplica a los límites de subprocesos.

$ perror 12
OS error code  12:  Cannot allocate memory

Supongo que, en todo caso, te estás quedando sin pila, si lo configuras en el valor predeterminado de Redhat de 8 MB, probablemente podrás ejecutar más subprocesos.

Este es el mismo que el vinculado con tamaños de pila explícitos establecidos en 8 MB. Vea lo que sucede cuando 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);
}

Respuesta3

Acabo de recibir la siguiente información: Esta es una limitación impuesta por mi proveedor de alojamiento. Esto no tiene nada que ver con programación o Linux.

información relacionada