以下是一些关于 Erlang SMP 实现细节、性能、伸缩性相关一些简单介绍。
-=-=-=-=-=-
几周之内还有一个关于多核如何运作以及未来如何发展的更详细的介绍。我打算将一些内容放在我的报告中,将于 9 月 27 日的 ICFP2008,Erlang Workshop 在 Victoria BC 展示给大家。
没有 SMP 支持的 Erlang VM 只有 1 个运行在主处理线程中的调度器。该调度器从运行队列(run-queue)中取出可以运行的 Erlang 进程以及 IO 任务,而且因为只有一个线程访问他们所以无须锁定任何数据。 而带有 SMP 支持的 Erlang VM 可以有一个或多个调度器,每个调度器运行在一个线程中。调度器从同一个公共运行队列中取出可运行的 Erlang 进程和 IO 任务。在 SMP VM 中所有的共享数据结构都会由锁进行保护,运行队列就是这样一个由锁保护的数据结构。
从 OTP R12B 开始,如果操作系统报告有多于 1 个的 CPU(或者核心),VM 的 SMP 版本会自动启动,并且根据 CPU 或者核心的数量启动同样数量的调度器。
你可以从“erl”命令打印出来的第一行看到它选择了哪些参数。例如:
1 |
|
其中“[smp:4]”表示 SMP VM 运行了 4 个调度器。
默认值可以用“-smp [enable|disable|auto]”来替换,auto 是默认的。如果 smp 被启用了(-smp enable),要设置调度器的数量可以使用“+S Number”其中 Number 是调度器的数量(1 到 1024)
注意1:运行多于 CPU 或核心总数的调度器不会有任何提升。
注意2:在某些操作系统中一个进程可使用的 CPU 或者核心的数量可以被限制。例如,在 Linux 中,命令“taskset”就可以实现这个功能。Erlang VM 目前还只能探测 CPU 或者核心的总数,不会考虑“taskset”所设置的掩码。正因如此,例如可能会出现(已经出现过了)即使 Erlang VM 运行了 4 个调度器,也只使用了 2 个核心。OS 会进行限制因为它要考虑“taskset”所设置的掩码。
每个 Erlang VM 的调度器都运行于一个 OS 线程上,是 OS 来决定线程是否执行在不同的核心上。一般来说 OS 会很好地处理这个问题并且会保证线程在执行期间运行于同一个核心上。
Erlang 进程会被不同的调度器运行,因为他们是从一个公共运行队列中被取出,由首先可用的调度器运行。
性能和伸缩性
只有一个调度器的 SMP VM 要比非 SMP 的 VM 稍微慢那么一点点。SMP VM 内部需要用到各种锁,不过只要不存在锁的争用,那么由锁引起的开销不会非常大(就是锁争用上面需要花时间)。这也解释了为何在某些情况下,运行多个只有一个调度器的 SMP VM 要比包含多个调度器的单一 SMP VM 更加高效。当然,运行多个 VM 要求应用可以按照多个并行任务的方式运行,并且之间没有或者几乎不通讯。
一个程序是否能在多核上的 SMP VM 中良好地进行提升很大程度上取决于程序的性质,某些程序可以保持线性提升至 8 核甚至 16 核,同时其他某些程序基本不能提升,连 2 核都不行。实际应用中很多程序都能在主流市场的核心数上得到提升,见下文。
若并行的持续“通话”由每个核心一个或多个 Erlang 进程来表示,实际的支持大量通话的电信产品已经显现出在双核和四核处理器上不俗的伸缩性。注意,这些产品是在 SMP VM 和多核处理器出现很久以前按照普通的 Erlang 风格来写的,他们也能无须任何修改甚至不需重新编译代码就能从 Erlang SMP VM 中获益。
SMP性能得到持续改进
SMP 实现正被不断改进以便能得到更好的性能和伸缩性。在每个服务发布版 R12B-1,2,3,4,5…,R13B 等等中,你都能发现新的优化。
一些已知的瓶颈
单一的常见运行队列随着 CPU 或核心的数量的增加会成为一个显著的瓶颈。 这从 4 核开始往上就会显现出来,不过 4 核仍然可以为多数应用程序提供不错的性能。我们正在从事一个每个调度器一个运行队列的解决方法作为目前最重要的改进。
Ets 表格会引入锁。在 R12B-4 之前在每次对一个 ets-table 的访问中会用到两个锁,但是在 R12B-4 中 meta-table 的锁被优化过,可以显著减少争用(前面已经提到争用是有很大代价的)。如果很多 Erlang 进程访问同一个表格,就会有很多锁争用造成性能降低,尤其当这些进程主要工作是访问 ets-table 。锁存在于表级而非记录级。注意!这也会影响到 Mnesia ,因为 Mnesia 用到了很多 ets-table 。
我们关于SMP的策略
当我们开始实现 SMP VM 的最初,我们就确定了策略:“首先让它可以运行,然后测量,然后优化”。自从 2006 年五月我们发布了第一个稳定的 SMP VM(R11B)以来,我们一直遵循着这个策略。
还有更多已知的东西可以改进,我们会按照性能的收益大小先后各个击破。
我们将主要的精力放在多核(大于 4)上更好的连续伸缩性上。
卓越典范
即使 SMP 系统有还有一些已知的瓶颈不过已经有不错的整体性能和伸缩性,同时我相信在让程序员利用多核机器事半功倍方面,我们是一个卓越的典范。
原文:http://groups.google.com/group/erlang-questions/browse_thread/thread/7827f5e32681ca8e