减少Linux中的每个线程内存

时间:2017-06-02 10:03:09

标签: c++ linux multithreading memory

我有一个C ++应用程序,可以创建大量的线程。使用ulimit -v unlimited,应用程序在创建1080个线程后崩溃并出现段错误。当我尝试访问分配了“new”的内存时发生崩溃。 “new”返回非空指针,但访问它会发出segfault。 使用ulimit -v 500000,应用程序不会崩溃,但会限制最大线程数(pthread_create失败 - 更好的行为)。 根据top,当总内存达到物理RAM的大小时,应用程序崩溃(ulimit -v unlimited)。 我需要有~1500个线程(我知道缺点......) 根据valgrind,线程非常小,每个线程使用~16kb的堆栈,所以我不知道为什么应用程序占用了这么多内存。 我可以更改/检查以减少每线程内存? ulimit -s 1024没有帮助。

1 个答案:

答案 0 :(得分:3)

new返回非空指针但在访问该内存时崩溃的问题是Linux内存过量使用"功能"。 man malloc

  

默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,无法保证内存确实可用。如果事实证明系统内存不足,那么一个或多个进程将被OOM杀手杀死。有关详细信息,请参阅/proc/sys/vm/overcommit_memory/proc/sys/vm/oom_adjproc(5)的说明以及Linux内核源文件Documentation/vm/overcommit-accounting

man pthread_create

  

在Linux / x86-32上,新线程的默认堆栈大小为2兆字节。在NPTL线程实现下,如果程序启动时RLIMIT_STACK软资源限制具有除" unlimited"以外的任何值,则它确定新线程的默认堆栈大小。使用pthread_attr_setstacksize(3),可以在用于创建线程的attr参数中显式设置堆栈大小属性,以获得除默认值之外的堆栈大小。