`
轮回记忆
  • 浏览: 10474 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

进程创建速度(转载yufeng老大的文章)

 
阅读更多
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个指令就搞定了 快快快。。。

结论是: 系统调用对于服务器的性能是很大的杀手!!
分享到:
评论

相关推荐

    yufeng-situ.github.io

    yufeng-situ.github.io

    使用套接字接口创建客户端和服务器进程

    本文将深入探讨如何使用C++编程语言通过套接字接口来创建客户端和服务器进程,使得它们能在互联网上相互通信。 首先,我们要理解套接字的基本概念。套接字是操作系统提供的一种编程接口,用于在网络中建立通信链接...

    时间片轮转法及优先数优先算法的进程调度管理程序

    - `create(char alg)`:初始化进程,读取输入并创建相应的进程控制块,然后将其插入就绪队列。 - `priority(char alg)`:实现优先级调度逻辑,但代码片段不完整。 ### 综合运用 该程序通过使用C语言实现了基于链表...

    Web-页面访问之旅

    介绍了web页面访问的过程中设计的计算机技术,包括url dns 网络协议等

    oracle创建用户详细流程

    此命令创建了一个名为`yu_data`的表空间,并指定了数据文件的位置及初始大小为1000MB。 #### 三、创建临时表空间 临时表空间主要用于存储临时数据,例如排序操作产生的临时结果。与普通表空间不同,临时表空间中的...

    Android-SD卡文件夹创建和删除实现

    本文将深入探讨如何在Android中创建和删除SD卡上的文件夹,以及如何利用ListView和BaseAdapter来显示这些文件夹信息。 首先,让我们了解如何获取SD卡的路径。在Android中,SD卡通常被视为外部存储,可以通过`...

    yu_java_475yu_475yu.com_yu823.com_

    标题 "yu_java_475yu_475yu.com_yu823.com_" 提示我们这是一个基于Java开发的Android应用项目,可能与文件管理器相关,涉及到475yu和yu823.com这两个可能的品牌或平台。描述中提到的"按音乐、图片、视频分类浏览的...

    Markdown编辑器 Yu Writer

    Yu Writer:一款能找到写作乐趣的 Markdown 文本编辑器,致力为你营造一个舒适、专注、高效的写作环境。网址:https://ivarptr.github.io/yu-writer.site/

    ORACLE安装步骤

    - **创建新用户**:登录到Oracle数据库,创建新的数据库用户,例如`yufeng/test`,并授予其必要的权限,如`connect`和`resource`权限。 ```sql CREATE USER yufeng IDENTIFIED BY test; GRANT connect, resource ...

    小程序富文本组件,支持渲染和编辑html,支持在微信,QQ,百度,支付宝,头条和uni-app平台使用- jin-yufeng / mp-html

    一个强大的小程序富文本组件 功能介绍 支持在多个主流的小程序平台和 uni-app 中使用 支持丰富的标签(包括 table、video、svg 等) 支持丰富的事件效果(自动预览图片、链接处理等) 支持设置占位图(加载中、出错...

    支持多种浏览器创建XMLHttpRequest对象代码

    ### 支持多种浏览器创建XMLHttpRequest对象代码 随着Web技术的发展与演进,跨浏览器兼容性一直是前端开发者面临的重要挑战之一。特别是在处理Ajax请求时,如何优雅地在不同浏览器(尤其是IE与其他现代浏览器)间...

    3954549yu6-f

    rsfkzlsgjja.04946-[2tjdlzdvmc/azfdgm x fsdfsh

    Motion Estimation Based On H.264 Video Coding

    Yufeng Li, Jufei Xiao, Wei Wu 来自中国沈阳航空航天大学电子信息工程学院 摘要 运动估计是H.264视频编码标准中最重要且最耗时的部分,约占编码时间的60%-80%。 研究高效的快速运动估计算法是视频压缩技术中的一个...

    yu课堂长江yu课堂

    yu课堂长江yu课堂,里面有两种(yu课堂、长江yu课堂)总有一款适合你,加了word教程,一步一步看教程即可使用。也可以直接点击用打包好的EXE文件,1.gua机签到;2.课件answer;3.live broadcast answer;4.Exam ...

    ajax创建动态表格

    使用Ajax创建动态表格及各种样式,可以方便了解Ajax的用处及好处

    Yu-RC1206单片机资料

    ### Yu-RC1206单片机资料详解 #### 一、概述 根据所提供的文件信息,实际上描述的是一款名为Yu-RC1206的贴片电阻产品,而非单片机。该文档主要介绍了这款产品的规格参数和技术细节。本文将基于给定的信息对Yu-RC...

    yu_delphi_源码

    在这个"yu_delphi_源码"项目中,我们主要关注的是如何在Delphi中创建一个线程,并在该线程中实现一个进度条(ProgressBar)从0到100的动态显示。 首先,我们要理解Delphi中的线程创建过程。在Delphi中,可以使用...

    信息安全考试yu.docx

    信息安全考试

    骰子:为Angela Yu的Web开发人员课程创建的骰子卷

    在本项目中,“骰子:为Angela Yu的Web开发人员课程创建的骰子卷”是一个基于JavaScript技术的互动应用,旨在帮助学习者理解和实践Web开发中的动态效果和交互设计。这个项目可能包括HTML、CSS以及JavaScript代码,...

    psd_keep_youyu02.apk

    psd_keep_youyu02.apk

Global site tag (gtag.js) - Google Analytics