`
ShiningRay
  • 浏览: 20146 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

关于Erlang和SMP的一些说明

阅读更多

http://shiningray.cn/some-facts-about-erlang-and-smp.html

原文:http://groups.google.com/group/erlang-questions/browse_thread/thread/7827f5e32681ca8e

by.Kenneth Erlang/OTP team, Ericsson
译:ShiningRay

 

以下是一些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”命令打印出来的第一行看到它选择了哪些参数。例如:


Erlang (BEAM) emulator version 5.6.4 [source] [smp:4] [asynch-threads:0] …..

其中“[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系统有还有一些已知的瓶颈不过已经有不错的整体性能和伸缩性,同时我相信在让程序员利用多核机器事半功倍方面,我们是一个卓越的典范。

6
3
分享到:
评论

相关推荐

    Erlang User Reference Manual

    ### 关于Erlang OTP系统文档的关键知识点 #### 标题与描述概述 - **标题**:“Erlang User Reference Manual”(Erlang 用户参考手册) - **描述**:“Erlang OTP官方用户手册 开发指南” 这些信息表明本手册是...

    erlang深度分析.pdf

    这涉及到监控ERTS的运行时参数,例如ETS(Erlang Term Storage)使用的内存、进程的数量和状态,以及SMP(对称多处理)支持程度等。 #### 3. 编码最佳实践 在Erlang开发中,最佳实践包括使用模式匹配、递归、消息...

    Erlang深度分析

    R12B版本包含了许多新特性和改进,例如改进的内存分配效率、smp的运行速度提升,以及新增加的eunit支持从archive读取代码。 #### 7. 结论 Erlang深度分析所包含的内容非常广泛,涵盖了从Erlang虚拟机的工作原理、...

    Erlang OPT system document

    ### Erlang OTP系统文档知识点概览 ...通过上述内容,您可以了解到Erlang/OTP的基本安装与构建流程,以及在使用过程中可能会遇到的一些问题及其解决方法。希望这些信息能够帮助您更好地理解和使用Erlang/OTP系统。

    inside Erlang VM3

    - **高效数据结构**:Erlang内置了几种高效的数据类型如原子(Atom)、二进制(Binary)、列表(List)和元组(Tuple)。 - **垃圾收集**:ERTS采用了标记-清除算法,并支持分代垃圾回收策略。 - **软实时系统**:ERTS支持软...

    erlang 深度分析

    - **故障隔离**: Erlang VM设计时考虑到了系统的容错性,通过监控和链接机制实现了故障隔离。 - **垃圾回收**: VM具有自动垃圾回收机制,但开发者可以通过调整来优化垃圾回收行为。 - **内部实现**: - **内存管理...

    高性能集群服务器Erlang解决方案

    2006年,随着R11B版本的发布,Erlang增加了对SMP(Symmetric Multi-Processing)的支持,使得Erlang程序能够在多核处理器上更好地并行执行。 #### Erlang的核心特性 - **内置并发**:Erlang通过轻量级进程(每个...

    Inside Erlang VM

    Erlang虚拟机的代码规模相对较小,这使得它适合于嵌入式系统,如BEAM.smp和BEAM.hybrid等版本针对不同场景进行了优化,以适应不同的硬件资源和性能需求。ERTS(Erlang Run-Time System)是Erlang VM的一部分,包含约...

    ezmq:用Erlang实现的zMQ

    确实存在一些用于C ++参考实现的Erlang包装器。 那么,为什么要重新发明Erlang呢? 首先,因为我们可以做到;-),其次,当使用C ++实现时,我们遇到了多次段错误,导致整个Erlang VM瘫痪,最重要的是,整个概念...

    javasnmp源码-docker-erlang-otp:DockerHub上的官方ErlangOTP镜像

    目标是为一些最新的 erlang 版本(当前 24 / 23 / 22 / 21 / 20 / 19 / 18)提供图像,接近全功能 Erlang OTP,以及相对纤薄的图像。 此 repo 中尽最大努力提供对 17、R16 和 R15 的支持,而不是 docker-library/...

    erlang-tls-misc:使用TLS进行节点间Erlang通信的示例

    ./setup.sh在一个终端中运行节点a: ./run-node-a.sh在另一个终端中运行节点b: ./run-node-b.sh预期产量: $ ./run-node-b.sh Erlang/OTP 23 [erts-11.1.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-...

    AjErl:用 C# 编写的类似 Erlang 的语言解释器

    特别是关于 Erlang/OTP 和多核性能 通信顺序过程 为 JavaTM (JCSP) 通信顺序进程 如果有的话,Erlang 进程如何映射到内核线程? 在 Erlang VM 内部,专注于 SMP Creación y conexión de nodos Erlang remotos ...

    otp:ErlangOTP

    Erlang是一种编程语言和运行时系统,用于构建对高可用性有要求的大规模可扩展的软实时系统。 OTP是一组Erlang库,它由Erlang运行时系统,一些主要用Erlang编写的即用型组件以及针对Erlang程序的一组设计原理组成。 ...

    Erlang中执行linux命令的两种方法

    值得注意的是,`erlang:open_port/2`虽然功能强大,但它的使用也会带来性能上的开销,因为这会导致Erlang虚拟机(VM,即beam.smp)在执行时阻塞。因此,在对性能要求较高的应用中,需要谨慎使用。 总结来说,`os:...

    cache_tab:内存缓存Erlang Elixir库

    用于Erlang / Elixir应用程序的内存中缓存应用程序 cache_tab应用程序旨在代理后端操作以进行键值插入,...Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [d

    Leix's Editor

    在Erlang shell中输入`erl -smp enable`启动Erlang虚拟机,然后执行`padn:s()`命令,即可启动IDE。这个步骤是为了确保Erlang能够充分利用多核资源,提高程序运行效率。 该IDE的核心组件包括以下几个beam文件: 1. `...

    tunctl:Erlang TUNTAP 接口

    tunctl 是一个用于创建和使用 TUN/TAP 接口的 Erlang API。 特权 Linux 对于 IPv4 地址,beam 需要有权限配置接口。 添加 cap_net_admin 功能: sudo setcap cap_net_admin=ep /path/to/bin/beam # or beam.smp ...

    Tentative new functions in R13B

    2. 对称多处理(SMP):引入了多运行队列和其它优化,这可能意味着Erlang系统现在能够更好地利用多核处理器的能力,提高并发处理性能。 3. “独立”Erlang功能增强:R13B版本增加了更多独立的Erlang方向的功能。这...

    eric:Erlang IRC 客户端

    埃里克 Erlang IRC 客户端 建造 $ make build 测试 $ make test 用法 作为图书馆 application : start ( eric ). ...Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe

Global site tag (gtag.js) - Google Analytics