How fast can Erlang create processes?
博客分类:
erlang
ErlangDebianLinuxCacheOS
原文地址: http://www.lshift.net/blog/2006/09/10/how-fast-can-erlang-create-processes
Very fast indeed.
1> spawntest:serial_spawn(1).
3.58599e+5
That’s telling me that Erlang can create and tear down processes at a rate of roughly 350,000 Hz. The numbers change slightly - things slow down - if I’m running the test in parallel:
2> spawntest:serial_spawn(10).
3.48489e+5
3> spawntest:serial_spawn(10).
3.40288e+5
4> spawntest:serial_spawn(100).
3.35983e+5
5> spawntest:serial_spawn(100).
3.36743e+5
[Update: I forgot to mention earlier that the system seems to spend 50% CPU in user and 50% in system time. Very odd! I wonder what the Erlang runtime is doing to spend so much system time?]
Here’s the code for what I’m doing:
-module(spawntest).
-export([serial_spawn/1]).
serial_spawn(M) ->
N = 1000000,
NpM = N div M,
Start = erlang:now(),
dotimes(M, fun () -> serial_spawn(self(), NpM) end),
dotimes(M, fun () -> receive X -> X end end),
Stop = erlang:now(),
(NpM * M) / time_diff(Start, Stop).
serial_spawn(Who, 0) -> Who ! done;
serial_spawn(Who, Count) ->
spawn(fun () ->
serial_spawn(Who, Count - 1)
end).
dotimes(0, _) -> done;
dotimes(N, F) ->
F(),
dotimes(N - 1, F).
time_diff({A1,A2,A3}, {B1,B2,B3}) ->
(B1 - A1) * 1000000 + (B2 - A2) + (B3 - A3) / 1000000.0 .
This is all on an Intel Pentium 4 running at 2.8GHz, with 1MB cache, on Debian linux, with erlang_11.b.0-3_all.deb.
我的实验如下:
root@nd-desktop:~/otp_src_R13B01# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Pentium(R) Dual-Core CPU E5200 @ 2.50GHz
stepping : 6
cpu MHz : 1200.000
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 4988.06
clflush size : 64
power management:
^Croot@nd-desktop:~# erl -smp disable
Erlang R13B01 (erts-5.7.2) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> os:getpid().
"14244"
2> spawntest:serial_spawn(1).
749026.6398814741
^Croot@nd-desktop:~/otp_src_R13B01# erl -pa /root
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> spawntest:serial_spawn(1).
402022.00990099803
结论是 beam比beam.smp要快很多,因为是所以的锁都去掉了。
我们来strace -o beam.trace.out -p 14244
root@nd-desktop:~# tail beam.trace.txt
clock_gettime(CLOCK_MONOTONIC, {3240006, 740886937}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740914525}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740942182}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740970048}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740997775}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741025363}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741053090}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741080956}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741109242}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741137318}) = 0
发现大量的sys调用, user和sys的时间都很多,这是不正常的。
gdb看了下 原来是
erl_process.c:alloc_process()
{...
erts_get_emu_time(&p->started); /* 获取进程创建时间*/
...
}
昂贵的系统调用哦 去掉它。。。
重新编译再看下结果。
root@nd-desktop:~/otp_src_R13B01# bin/erl -smp disable -pa /root
Erlang R13B01 (erts-5.7.2) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> spawntest:serial_spawn(1).
2264041.5859158505
2>
root@nd-desktop:~/otp_src_R13B01# bin/erl -pa /root
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> spawntest:serial_spawn(1).
652946.9454488944
2>
看到了吧 在beam vm下每秒最多可创建 2百万个进程 比原来快了3倍, 也就是说 创建一个进程并且销毁的开心是 0.5us 太快了, 我的机器的bogo mips是4988, 哈哈 2500个指令就搞定了 快快快。。。
结论是: 系统调用对于服务器的性能是很大的杀手!!
博客分类:
erlang
ErlangDebianLinuxCacheOS
原文地址: http://www.lshift.net/blog/2006/09/10/how-fast-can-erlang-create-processes
Very fast indeed.
1> spawntest:serial_spawn(1).
3.58599e+5
That’s telling me that Erlang can create and tear down processes at a rate of roughly 350,000 Hz. The numbers change slightly - things slow down - if I’m running the test in parallel:
2> spawntest:serial_spawn(10).
3.48489e+5
3> spawntest:serial_spawn(10).
3.40288e+5
4> spawntest:serial_spawn(100).
3.35983e+5
5> spawntest:serial_spawn(100).
3.36743e+5
[Update: I forgot to mention earlier that the system seems to spend 50% CPU in user and 50% in system time. Very odd! I wonder what the Erlang runtime is doing to spend so much system time?]
Here’s the code for what I’m doing:
-module(spawntest).
-export([serial_spawn/1]).
serial_spawn(M) ->
N = 1000000,
NpM = N div M,
Start = erlang:now(),
dotimes(M, fun () -> serial_spawn(self(), NpM) end),
dotimes(M, fun () -> receive X -> X end end),
Stop = erlang:now(),
(NpM * M) / time_diff(Start, Stop).
serial_spawn(Who, 0) -> Who ! done;
serial_spawn(Who, Count) ->
spawn(fun () ->
serial_spawn(Who, Count - 1)
end).
dotimes(0, _) -> done;
dotimes(N, F) ->
F(),
dotimes(N - 1, F).
time_diff({A1,A2,A3}, {B1,B2,B3}) ->
(B1 - A1) * 1000000 + (B2 - A2) + (B3 - A3) / 1000000.0 .
This is all on an Intel Pentium 4 running at 2.8GHz, with 1MB cache, on Debian linux, with erlang_11.b.0-3_all.deb.
我的实验如下:
root@nd-desktop:~/otp_src_R13B01# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Pentium(R) Dual-Core CPU E5200 @ 2.50GHz
stepping : 6
cpu MHz : 1200.000
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 4988.06
clflush size : 64
power management:
^Croot@nd-desktop:~# erl -smp disable
Erlang R13B01 (erts-5.7.2) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> os:getpid().
"14244"
2> spawntest:serial_spawn(1).
749026.6398814741
^Croot@nd-desktop:~/otp_src_R13B01# erl -pa /root
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> spawntest:serial_spawn(1).
402022.00990099803
结论是 beam比beam.smp要快很多,因为是所以的锁都去掉了。
我们来strace -o beam.trace.out -p 14244
root@nd-desktop:~# tail beam.trace.txt
clock_gettime(CLOCK_MONOTONIC, {3240006, 740886937}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740914525}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740942182}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740970048}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 740997775}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741025363}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741053090}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741080956}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741109242}) = 0
clock_gettime(CLOCK_MONOTONIC, {3240006, 741137318}) = 0
发现大量的sys调用, user和sys的时间都很多,这是不正常的。
gdb看了下 原来是
erl_process.c:alloc_process()
{...
erts_get_emu_time(&p->started); /* 获取进程创建时间*/
...
}
昂贵的系统调用哦 去掉它。。。
重新编译再看下结果。
root@nd-desktop:~/otp_src_R13B01# bin/erl -smp disable -pa /root
Erlang R13B01 (erts-5.7.2) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> spawntest:serial_spawn(1).
2264041.5859158505
2>
root@nd-desktop:~/otp_src_R13B01# bin/erl -pa /root
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> spawntest:serial_spawn(1).
652946.9454488944
2>
看到了吧 在beam vm下每秒最多可创建 2百万个进程 比原来快了3倍, 也就是说 创建一个进程并且销毁的开心是 0.5us 太快了, 我的机器的bogo mips是4988, 哈哈 2500个指令就搞定了 快快快。。。
结论是: 系统调用对于服务器的性能是很大的杀手!!
发表评论
-
Erlang在并发,容错,多核上的优势(转载)
2014-11-03 11:05 746作为一名程序员,随着 ... -
游戏圧测性能总结
2013-06-04 17:29 582前段时间项目压测,顺利通过,现在总结下压测过程中主要的瓶颈以及 ... -
查看节点文件句柄数量(转载)
2013-04-05 22:34 1519很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
erlang NIF实现的素数求解效率(转载)
2013-04-05 22:34 732在素数求解,兼谈Erlang的性能特性一文中比较了Erlang ... -
多函数匹配与单函数判断的性能比较(转载)
2013-04-05 22:35 449Erlang中应用了大量的匹配语法,那么到底是多函数的when ... -
断言位置的选择:谁犯错谁异常(转载)
2013-04-02 22:59 545比如某gen_server: Erlang代码 收藏代码 ... -
ejabberd HTTP request handlers处理 post get (转载)
2013-04-02 22:48 707小例子http://www.process-one.net/e ... -
erlang网络调优
2013-04-02 22:45 778原文网址:erlang网络编程的几个性能调优和注意点 原文作者 ... -
Erlang 实践杂记(转载)
2013-04-02 22:40 747发表时间:2012-05-12 < > ... -
Erlang Tips
2013-03-30 16:45 858转载请注明:来自http://blog.csdn.net/sk ...
相关推荐
yufeng-situ.github.io
本文将深入探讨如何使用C++编程语言通过套接字接口来创建客户端和服务器进程,使得它们能在互联网上相互通信。 首先,我们要理解套接字的基本概念。套接字是操作系统提供的一种编程接口,用于在网络中建立通信链接...
- `create(char alg)`:初始化进程,读取输入并创建相应的进程控制块,然后将其插入就绪队列。 - `priority(char alg)`:实现优先级调度逻辑,但代码片段不完整。 ### 综合运用 该程序通过使用C语言实现了基于链表...
介绍了web页面访问的过程中设计的计算机技术,包括url dns 网络协议等
此命令创建了一个名为`yu_data`的表空间,并指定了数据文件的位置及初始大小为1000MB。 #### 三、创建临时表空间 临时表空间主要用于存储临时数据,例如排序操作产生的临时结果。与普通表空间不同,临时表空间中的...
本文将深入探讨如何在Android中创建和删除SD卡上的文件夹,以及如何利用ListView和BaseAdapter来显示这些文件夹信息。 首先,让我们了解如何获取SD卡的路径。在Android中,SD卡通常被视为外部存储,可以通过`...
标题 "yu_java_475yu_475yu.com_yu823.com_" 提示我们这是一个基于Java开发的Android应用项目,可能与文件管理器相关,涉及到475yu和yu823.com这两个可能的品牌或平台。描述中提到的"按音乐、图片、视频分类浏览的...
Yu Writer:一款能找到写作乐趣的 Markdown 文本编辑器,致力为你营造一个舒适、专注、高效的写作环境。网址:https://ivarptr.github.io/yu-writer.site/
- **创建新用户**:登录到Oracle数据库,创建新的数据库用户,例如`yufeng/test`,并授予其必要的权限,如`connect`和`resource`权限。 ```sql CREATE USER yufeng IDENTIFIED BY test; GRANT connect, resource ...
一个强大的小程序富文本组件 功能介绍 支持在多个主流的小程序平台和 uni-app 中使用 支持丰富的标签(包括 table、video、svg 等) 支持丰富的事件效果(自动预览图片、链接处理等) 支持设置占位图(加载中、出错...
### 支持多种浏览器创建XMLHttpRequest对象代码 随着Web技术的发展与演进,跨浏览器兼容性一直是前端开发者面临的重要挑战之一。特别是在处理Ajax请求时,如何优雅地在不同浏览器(尤其是IE与其他现代浏览器)间...
rsfkzlsgjja.04946-[2tjdlzdvmc/azfdgm x fsdfsh
Yufeng Li, Jufei Xiao, Wei Wu 来自中国沈阳航空航天大学电子信息工程学院 摘要 运动估计是H.264视频编码标准中最重要且最耗时的部分,约占编码时间的60%-80%。 研究高效的快速运动估计算法是视频压缩技术中的一个...
yu课堂长江yu课堂,里面有两种(yu课堂、长江yu课堂)总有一款适合你,加了word教程,一步一步看教程即可使用。也可以直接点击用打包好的EXE文件,1.gua机签到;2.课件answer;3.live broadcast answer;4.Exam ...
使用Ajax创建动态表格及各种样式,可以方便了解Ajax的用处及好处
### Yu-RC1206单片机资料详解 #### 一、概述 根据所提供的文件信息,实际上描述的是一款名为Yu-RC1206的贴片电阻产品,而非单片机。该文档主要介绍了这款产品的规格参数和技术细节。本文将基于给定的信息对Yu-RC...
在这个"yu_delphi_源码"项目中,我们主要关注的是如何在Delphi中创建一个线程,并在该线程中实现一个进度条(ProgressBar)从0到100的动态显示。 首先,我们要理解Delphi中的线程创建过程。在Delphi中,可以使用...
信息安全考试
在本项目中,“骰子:为Angela Yu的Web开发人员课程创建的骰子卷”是一个基于JavaScript技术的互动应用,旨在帮助学习者理解和实践Web开发中的动态效果和交互设计。这个项目可能包括HTML、CSS以及JavaScript代码,...
psd_keep_youyu02.apk