erlang在smp模式下 默认开启的线程数目是 4 + 调度器数量 + 异步线程的数量。 其中调度器默认=cpu的数目 异步线程的数量默认是0, 可以通过 +A来设置,主要用于文件异步IO操作。 对于现在的机器 可能有大量的cpu 那么默认开启的线程可能多达几十个。 众所周知,32位系统下用户空间的线性地址是3G. 每个线程都有自己的堆栈,虽然实际使用的空间不大, 但是为了预防大量的递归调用什么的,这个堆栈的空间会开的比较大。默认是每个线程
# [color=red]ulimit -s[/color]
10240 有10M这么大。 几十个线程就占用了大几百M的线性空间。对于3G地址,使用率非常低。
在最新发布的R13B02就专门解决这个问题:
erl +A N [color=red]+a [/color]StackSize 异步线程
默认是 ERTS_ASYNC_THREAD_MIN_STACK_SIZE
#define ERTS_ASYNC_THREAD_MIN_STACK_SIZE 16 /* Kilo words */
#define ERTS_ASYNC_THREAD_MAX_STACK_SIZE 8192 /* Kilo words */
erl +S N:N [color=red]+sss[/color] StackSize 调度器线程
默认是 -1, 由系统决定。
#define ERTS_SCHED_THREAD_MIN_STACK_SIZE 4 /* Kilo words */
#define ERTS_SCHED_THREAD_MAX_STACK_SIZE 8192 /* Kilo words */
注意上面的单位是 WORD, 而不是BYTE.
通过微调pthread的stacksize,而不是使用系统默认的。
stack size (kbytes, -s) 8192
还有的4个辅助线程,erts已经把stack_size修改成最小了,各位无需担心。
R13B02为了支持最小的调度器线程堆栈,特地修改了部分BIF, 尽量不采用递归的方式, 减少了堆栈的使用。
当然最好的方法是使用64位操作系统,彻底回避这个问题。
[color=red]结论:32位系统会比较快,但是有线性地址的限制,节约点是好事。[/color]
# [color=red]ulimit -s[/color]
10240 有10M这么大。 几十个线程就占用了大几百M的线性空间。对于3G地址,使用率非常低。
在最新发布的R13B02就专门解决这个问题:
erl +A N [color=red]+a [/color]StackSize 异步线程
默认是 ERTS_ASYNC_THREAD_MIN_STACK_SIZE
#define ERTS_ASYNC_THREAD_MIN_STACK_SIZE 16 /* Kilo words */
#define ERTS_ASYNC_THREAD_MAX_STACK_SIZE 8192 /* Kilo words */
erl +S N:N [color=red]+sss[/color] StackSize 调度器线程
默认是 -1, 由系统决定。
#define ERTS_SCHED_THREAD_MIN_STACK_SIZE 4 /* Kilo words */
#define ERTS_SCHED_THREAD_MAX_STACK_SIZE 8192 /* Kilo words */
注意上面的单位是 WORD, 而不是BYTE.
通过微调pthread的stacksize,而不是使用系统默认的。
stack size (kbytes, -s) 8192
还有的4个辅助线程,erts已经把stack_size修改成最小了,各位无需担心。
R13B02为了支持最小的调度器线程堆栈,特地修改了部分BIF, 尽量不采用递归的方式, 减少了堆栈的使用。
当然最好的方法是使用64位操作系统,彻底回避这个问题。
[color=red]结论:32位系统会比较快,但是有线性地址的限制,节约点是好事。[/color]