R13B02的线程stack size设置

在Erlang的SMP模式中,默认线程数由CPU数量等因素决定,可能会占用大量32位系统的线性地址空间。R13B02版本引入了新的参数来调整线程堆栈大小,解决了这一问题,并提高了资源利用率。
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值