当前位置: 首页 > 面试题库 >

NPTL将最大线程数限制为65528吗?

宋和颂
2023-03-14
问题内容

以下代码假定可以创建100,000个线程:

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

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

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

它运行在具有32GB RAM的64位计算机上;已安装Debian 5.0,所有库存。

  • ulimit -s 512来减小堆栈大小
  • / proc / sys / kernel / pid_max设置为1,000,000(默认情况下,上限为32k pid)。
  • 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

我当然不会用完内存。我什至可以启动多个同时运行的程序,它们都启动65k线程。

(请不要建议我不要尝试启动100,000个以上的线程。这是对 应该 正常工作的简单测试。我当前的基于epoll的服务器始终具有大约200k
+的连接,各种论文都认为线程可能是一个更好的选择。
- 谢谢 :) )


问题答案:

pilcrow的提法/proc/sys/vm/max_map_count是正确的;提高该值允许打开更多线程;不确定确切的公式,但是1mil
+的值允许300k +线程。

(对于尝试使用100k
+线程的其他用户,请查看pthread_create的mmap问题…当消耗较少的内存时,使新线程变得非常慢。)



 类似资料:
  • 我正在尝试创建一个具有一定数量线程的ThreadPoolExector,但同时,我想控制池队列的大小。所以我使用完整的构造函数创建了执行器: 然而,这给了我一个非法辩论例外。如果我将构造函数更改为 它起作用了。如果我希望理想的线程数和最大线程数相同,为什么它不起作用呢。

  • 所以我们有一些游戏服务器在我们的V服务器上运行(我说的这款有8Vcore、4.2GHz和32GB DDR4内存),例如Minecraft。我们的问题是服务器在大约640个线程的情况下耗尽了内存(它不关心栈大小,1024KB、512KB都是相同的结果)。那么有没有办法从我们的系统中得到更多的线程呢? Linux:Debian 9 Virtuozzo容器 Java: openjdk版本“1.8.023

  • 问题内容: 我想创建一个运行多个轻线程的程序,但将其自身限制为恒定的,预定义数量的并发运行任务,如下所示(但不存在竞争条件的风险): 最安全/最快的方法是什么? 问题答案: 听起来您想用8个工人实现生产者/消费者模式。Python为此提供了一个类,它是线程安全的。 每个工作人员都应调用队列以检索任务。如果没有可用的任务,此调用将阻塞,从而导致工作人员空闲直到可用。然后,工作人员应执行任务,最后在队

  • 问题内容: 我在实践中阅读Java Concurrency,并且有点与线程限制概念混淆。这本书说 当一个对象被限制在一个线程中时,即使该限制对象本身不是一个线程,这种使用也是自动的线程安全的 那么,当一个对象被限制在一个线程中时,没有其他线程可以访问它吗?那就是局限于线程吗?如何将对象限制在线程中? 编辑: 但是,如果我仍然想与另一个线程共享对象怎么办?假设在线程A完成对象O后,线程B想要访问O。

  • 问题内容: 基本上我需要在更多线程中运行〜数百个计算。我只想在paralell中运行一些并行线程,例如5个线程和5个计算。 我正在使用spring框架,@Async选项是自然选择。我不需要全功能的JMS队列,这对我来说有点麻烦。 有任何想法吗 ?谢谢 问题答案: 你检查了吗?你可以定义一个线程池,其中包含最大数量的线程来执行任务。 如果要与结合使用,请在spring-config中使用它:

  • 问题内容: 我是否可以使用Spring Security来限制能够同时登录网站的最大用户数量? 绝对不是并发会话控制参数。例如,我要限制最大只允许1000个用户同时登录。如果超过该通知页面说明已超过最大用户数 问题答案: 您可以通过访问SessionRegistry来查找当前登录的用户,从而使用Spring Security的并发会话控制。在Spring Security 3中,Concurren