`
ShiningRay
  • 浏览: 19650 次
  • 性别: 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
分享到:
评论

相关推荐

    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程序的一组设计原理组成。 ...

    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

    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 ...

    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

    bbmustache:基于二进制模式匹配的ErlangOTP的Mustache模板引擎

    bbmustache ...Erlang/OTP 17 [erts-6.3] [source-f9282c6] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:true] Eshell V6.3 (abort with ^G) 1> bbmustache:render( << " {{na

    alpine-elixir:一个基于我的alpine-erlang镜像的Elixir应用程序的Dockerfile

    高山Linux上的Elixir 该Dockerfile在Alpine上提供了Erlang和Elixir的完整安装,旨在运行发行版,因此未安装任何构建工具。 提供了Erlang安装,因此可以避免交叉编译版本。 当然要注意的是,如果有人拥有需要本机编译...

    如何解决SELinux阻止虚拟机访问文件?

    我用的是Fedora 17和KVM,虚拟机运行得很好。我尝试访问主机系统上的一个文件,但SELinux阻止虚拟化访问除了/var/lib/libvirt/images里的其他文件。当在共享路径上宿主的虚拟机运行时,主机给出以下信息:SELinux is...

    Leix's Editor

    这是本人自己编写的Erlang的IDE,启动时若是单核CPU,需要打开smp,启动erl后输入padn:s()即可。应该还有很多bug,欢迎报告:tearsofphoenix@yahoo.cn

    publicsuffix-erl:从给定的主机名URL中提取顶级域(TLD)

    公共后缀 Erlang到接口。 ... 受 (但也支持Unicode TLD)和启发。 要求 Erlang 17.0或更高版本(也应...Erlang / OTP 17 [ erts - 6.3 ] [ source ] [ 64 - bit ] [ smp : 4 : 4 ] [ async - threads : 10 ] [ hipe ]

    erlserver:二郎游戏服务器

    一个简单的Erlang GameServer, 正在持续...Erlang/OTP 17 [erts-6.3.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Eshell V6.3.1 (abort with ^G) 1> login_case:run().

    yfinance-lfe:LFE库用于查询实时股票市场数据,包括纳斯达克和S&P500等指数

    融资 F#库端口,最初由@owainlewis从移植。 介绍 LFE库用于查询实时股票市场数据,包括纳斯达克和S&P500等指数。...Erlang/OTP 17 [erts- 6.4 ] [source] [ 64 -bit] [smp: 4 : 4 ] [async-threads: 10 ] [hi

    workshop-parallel-computation-with-elixir

    自述文件实验室要求安装git Windows:通过安装OS X:使用软件包管理器或安装Linux:通过分发程序包管理器或安装安装Erlang&Elixir(至少1.6) 参见验证您的安装通过在外壳程序中调用可执行文件git , erl和iex来...

    liveview_march_2021:Groxio课程资料库,实时取景于2021年3月

    Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] Elixir 1.11.2 (compiled with Erlang/OTP 23) node.js。 不可选! 凤凰资产 Phoenix 1.5.6+(包括LiveView。) ...

    snmpcl:简单的SNMP客户端,例如snmpwalk

    Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:0] [hipe] [kernel-poll:false] Eshell V9.1 (abort with ^G) 1> snmpcl:walk({127,0,0,1}, [1,3,6,1,2,1,1,5,0]). {[1,3,6,1,2,...

    beruang:重新启动后检索您的ets

    Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Eshell V6.3 (abort with ^G) 1> application:start(beruang). ok 2> Tab = beruang:get_ets...

    oauth_flow_demo:Oauth认证の流れをプロセスで再现したやつ

    Erlang/OTP 23 [erts-11.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace] Elixir 1.10.3 (compiled with Erlang/OTP 22) 调查メモ 认证について SSO(SingleSignOn)->例如:免许...

Global site tag (gtag.js) - Google Analytics