613 Threads-Limit unter Debian

613 Threads-Limit unter Debian

Beim Ausführen dieses ProgrammsThread-Limit.cAuf meinem dedizierten Debian-Server heißt es in der Ausgabe, dass mein System nicht mehr als etwa 600 Threads erstellen kann. Ich muss mehr Threads erstellen und meine Systemfehlkonfiguration beheben.

Hier ein paar Informationen zu meinem dedizierten Server:

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

Hier ist die Ausgabe des C-Programms

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.

Irgendwelche Ideen, wie man das beheben kann?

Antwort1

Sie müssen nicht mehr als 600 Threads gleichzeitig erstellen. Sie benötigen Threads nur für Dinge, die Sie gleichzeitig sinnvoll erledigen können. Ihr System kann nicht mehr als 600 Dinge gleichzeitig sinnvoll erledigen. Sie benötigen nicht mehr Threads, um mehr Arbeit zu erledigen.

In jedem Fall legen Sie die falsche Stapelgröße fest. Sie legen die Grenzgröße des anfänglichen Thread-Stapels fest, der nicht von Ihrem Code erstellt wird. Sie sollten die Größe des Stapels der Threads festlegen, die Ihr Code erstellt.

Ändern:

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

zu (ungefähr):

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

Sie können auch pthread_attr_getstacksizedie Standardgröße des Thread-Stacks Ihrer Plattform ermitteln. Beachten Sie, dass Ihr Prozess beendet wird, wenn ein Thread seinen zugewiesenen Stack überschreitet.

Selbst bei einem 2-MB-Stapel, der sehr gefährlich sein kann, benötigen Sie immer noch 1,2 GB, nur damit der Stapel 600 Threads hat. Was auch immer Ihr Job ist, Threads sind nicht das richtige Werkzeug dafür.

Antwort2

Dies hat nichts mit Thread-Limits zu tun. Fehlercode 12 gilt nicht für Thread-Limits.

$ perror 12
OS error code  12:  Cannot allocate memory

Ich schätze, wenn Ihr Stapelspeicher zur Neige geht, können Sie wahrscheinlich mehr Threads ausführen, wenn Sie ihn auf den RedHat-Standardwert von 8 MB setzen.

Dies ist dasselbe wie das verlinkte, wobei die explizite Stapelgröße auf 8 MB festgelegt ist. Sehen Sie, was passiert, wenn Sie dieses kompilieren.

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

Antwort3

Habe gerade folgende Information erhalten: Dies ist eine Einschränkung, die von meinem Hostprovider auferlegt wurde. Das hat nichts mit Programmierung oder Linux zu tun.

verwandte Informationen