当前位置: 技术问答>linux和unix
Linux最大线程数的问题.
来源: 互联网 发布时间:2016-02-28
本文导语: 线程数跟系统资源也有关系,在kernel中有这样的代码: max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE); /* * we need to allow at least 20 threads to boot a system */ if(max_threads rlim[RLIMIT_NPROC].rlim_cur = max_threads/2; init_task.s...
线程数跟系统资源也有关系,在kernel中有这样的代码:
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
/*
* we need to allow at least 20 threads to boot a system
*/
if(max_threads rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
当内存总数不多时,线程数也会限制在一定数额。
请问 max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
这里为什么要多除以一个8?
小弟是初学者,请各位大虾指点一下.
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
/*
* we need to allow at least 20 threads to boot a system
*/
if(max_threads rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
当内存总数不多时,线程数也会限制在一定数额。
请问 max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
这里为什么要多除以一个8?
小弟是初学者,请各位大虾指点一下.
|
每个内核线程至少占用THREAD_SIZE大小的空间来存放内核堆栈,进程描述符等核心信息。在深入理解Linux内核中指出,所有进程描述符和内核堆栈所占的空间不能超过物理空间的1/8。
所以有max_threads=mempages / (THREAD_SIZE/PAGE_SIZE) / 8;
。这更多的是一个经验值吧,系统管理员可以通过/proc/sys/kernel/thread-max 来修改这个值。
所以有max_threads=mempages / (THREAD_SIZE/PAGE_SIZE) / 8;
。这更多的是一个经验值吧,系统管理员可以通过/proc/sys/kernel/thread-max 来修改这个值。
|
void __init fork_init(unsigned long mempages)
{
/*
* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8;
init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
}
我的内核里是这样的呀。
THREAD_SIZE是8k。PAGE_SIZE是4k。(THREAD_SIZE/PAGE_SIZE) = 2。所以需要再除以8
我觉得是这样子的,请高人评定。
|
最初的设计这里是除以2,在2.4.0官方版本可以看到:
max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 2;
不过到了Redhat7.3的2.4.18-3,就变成了除以8了。显然这里是有讲究的。按照除以2的版本,对于i386来讲,max_threads = mempages / 4,对于i386,一个thread_info是两个PAGE,所以最后max_threads正好消耗内存的一半。
(最后这个除以2让人比较迷惑,是被分母除还是被整个结果除,所以后来把它移到前面,变成(8*THREAD_SIZE/PAGE_SIZE))
至于为何改成8,我没有查出来,但是至少有一个原因就是如果是2,会造成某些时候出现除0的错误,比如说THREAD_SIZE
max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 2;
不过到了Redhat7.3的2.4.18-3,就变成了除以8了。显然这里是有讲究的。按照除以2的版本,对于i386来讲,max_threads = mempages / 4,对于i386,一个thread_info是两个PAGE,所以最后max_threads正好消耗内存的一半。
(最后这个除以2让人比较迷惑,是被分母除还是被整个结果除,所以后来把它移到前面,变成(8*THREAD_SIZE/PAGE_SIZE))
至于为何改成8,我没有查出来,但是至少有一个原因就是如果是2,会造成某些时候出现除0的错误,比如说THREAD_SIZE