`
mryufeng
  • 浏览: 969018 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

R13B02的线程stack size设置

阅读更多
erlang在smp模式下 默认开启的线程数目是 4 + 调度器数量 + 异步线程的数量。 其中调度器默认=cpu的数目 异步线程的数量默认是0, 可以通过 +A来设置,主要用于文件异步IO操作。 对于现在的机器 可能有大量的cpu  那么默认开启的线程可能多达几十个。 众所周知,32位系统下用户空间的线性地址是3G. 每个线程都有自己的堆栈,虽然实际使用的空间不大, 但是为了预防大量的递归调用什么的,这个堆栈的空间会开的比较大。默认是每个线程
[root@localhost ~]# ulimit -s
10240 有10M这么大。 几十个线程就占用了大几百M的线性空间。对于3G地址,使用率非常低。

在最新发布的R13B02就专门解决这个问题:

erl +A N  +a 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  +sss 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位操作系统,彻底回避这个问题。

结论:32位系统会比较快,但是有线性地址的限制,节约点是好事。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics