Cod*_*oll 15
假设您运行了10,000个Erlang/Elixir进程.为简单起见,我们还要说您的计算机只有一个单核进程.处理器一次只能做一件事,因此在任何给定时刻只能执行一个进程.
假设其中一个进程有一个长期运行的任务.如果Erlang VM无法中断进程,则每个其他进程都必须等到该进程完成其任务.当您尝试处理数以万计的请求时,这不能很好地扩展.
值得庆幸的是,Erlang VM并不是那么天真.当一个进程旋转时,它会减少2,000次(函数调用).每次进程调用一个函数时,它的减少计数减少1.一旦减少计数达到零,进程就会被中断(它会隐式地产生执行),并且它必须等待轮到它.
因为Erlang/Elixir没有循环,所以必须以递归方式迭代大型数据结构.这意味着,与大多数循环成为系统瓶颈的语言不同,每次迭代都会耗尽其中一个进程的缩减,并且进程无法执行.
这个答案的其余部分超出了问题的范围,但包括完整性.
现在让我们说你有一个4核的处理器.VM将启动4个调度程序(每个核心1个),而不是只有1个调度程序.如果有足够的进程在运行,第一个调度程序无法在合理的时间内处理负载,则第二个调度程序将控制多余的进程,并与第一个调度程序并行执行.
如果这两个调度程序无法在合理的时间内处理负载,则第三个调度程序将承担部分负载.这一直持续到所有处理器都被充分利用为止.
此外,VM非常智能,不会浪费时间在空闲的进程上 - 即只是等待消息.
JLouis有一篇关于Erlang如何进行调度的优秀博客文章.我建议阅读它.
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |