在Linux中,最大线程数定义为max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
,可以通过调用cat /proc/sys/kernel/threads-max
来获取最大线程数。对于树莓派3,这大约返回14,000。但是,当我仅使用pthread_create()
(空)在循环中创建线程时,我只能创建250,然后再获得ENOMEM (Cannot allocate memory)
。 >
现在,我查看了分配给进程或线程的默认堆栈,即8192k。因此,大约有250个线程时,我将使用2GB内存。但是,在我看来,这也不是总和,因为调用free -m
显示我总共有1GB的内存。
由于我有1GB的内存,所以我希望最多只能创建125个线程,而不是250个线程,而不是14000个线程。
为什么要创建250个线程?
答案 0 :(得分:2)
默认情况下,Linux执行内存过量使用。这意味着您可以分配比物理内存更多的匿名可写内存。
您可以使用以下方法关闭内存过量使用:
# sysctl vm.overcommit_memory=2
这将导致某些工作负载失败,这些工作负载在vm.overcommit_memory=0
模式下可以正常工作。可以在overcommit accounting documentation中找到一些详细信息。