erts_ use_sender_punish未公开的特性
May 3rd, 2010
原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: erts_ use_sender_punish未公开的特性
我们知道erlang的VM调度是根据reds的,每个进程初始的时候分配2000个reds, 一旦这个reds用完了,进程就被挂起,放到队列去排队,等待下一次调度。OTP R13B04下一个进程给另外一个进程发送消息,是需要扣除发送者一定的reds, 这样看起来更公平。因为古语说杀敌一千, 自损八百。 但是Erlang有个未公开的选项来避开这种情况:erl +snsp
我们来看代码:
emulator/beam/erl_init.c
1131 else if (sys_strcmp("nsp", sub_param) == 0) 1132 erts_use_sender_punish = 0;
emulator/beam/bif.c
/* send to local process */ erts_send_message(p, rp, &rp_locks, msg, 0); if (!erts_use_sender_punish) res = 0; else { #ifdef ERTS_SMP res = rp->msg_inq.len*4; if (ERTS_PROC_LOCK_MAIN & rp_locks) res += rp->msg.len*4; #else res = rp->msg.len*4; #endif }
正常情况下 扣除的reds是 接收者队列长度的4倍。
结论: 我们如果需要批量发送的场合,可以使用这个选项。
Post Footer automatically generated by wp-posturl plugin for wordpress.
Recent Comments