NPTL ограничивает максимальное количество потоков при 65528?

Следующий код должен создать 100 000 потоков:

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

#include 
#include 
#include 
#include 
#include 

#define MAX_THREADS 100000
int i;

void run(void) {
  sleep(60 * 60);
}

int main(int argc, char *argv[]) {
  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 (%s).\n",
         rc, i + 1, strerror(rc));

      // can we allocate memory?
      char *block = NULL;
      block = malloc(65545);
      if(block == NULL)
        printf("Malloc failed too :( \n");
      else
        printf("Malloc worked, hmmm\n");
    }
  }
sleep(60*60); // ctrl+c to exit; makes it easier to see mem use
  exit(0);
}

Он работает на 64-битной машине с 32 ГБ ОЗУ; Debian 5.0 установлен, все сток.

  • ulimit -s 512, чтобы сохранить размер стека
  • / proc / sys / kernel / pid_max установленным в 1,000,000 (по умолчанию он ограничен 32 тыс. Пид).
  • ulimit -u 1000000 для увеличения макс процессов (не думаю, что это вообще имеет значение)
  • / proc / sys / kernel / threads-max установлен в 1 000 000 (по умолчанию он вообще не был установлен)

Выполнение этого выплевывает следующее:

65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm

У меня точно не заканчивается баран; Я даже могу запустить еще несколько этих программ, работающих в одно и то же время, и все они запускают свои потоки по 65 тыс.

(Пожалуйста, воздержитесь от предложения не пытаться запускать более 100 000 потоков. Это простое тестирование чего-то, что должно работать. Мой текущий сервер на базе epoll всегда имеет около 200 тыс. Подключений и различные статьи предполагают, что потоки могут быть лучшим вариантом. - Спасибо :))

5
задан rekamso 19 August 2010 в 16:38
поделиться