- 浏览: 982321 次
- 性别:
- 来自: 广州
最新评论
-
qingchuwudi:
有用,非常感谢!
erlang进程的优先级 -
zfjdiamond:
你好 这条命令 在那里输入??
你们有yum 我有LuaRocks -
simsunny22:
这个是在linux下运行的吧,在window下怎么运行escr ...
escript的高级特性 -
mozhenghua:
http://www.erlang.org/doc/apps/ ...
mnesia 分布协调的几个细节 -
fxltsbl:
A new record of 108000 HTTP req ...
Haproxy 1.4-dev2: barrier of 100k HTTP req/s crossed
在我的項目里面, 很多運算logic是由外部的程序來計算的 那么消息先透過pipe發到外部程序,外部程序讀到消息, 處理消息, 寫消息, erlang程序讀到消息, 這條鏈路很長,而且涉及到pipe讀寫,上下文切換,這個開銷是很大的.但是具體是多少呢?
我設計了個這樣的ring. 每個ring有N個環組成, 每個環開個port. 當ring收到個數字的時候 如果數字不為0, 那么把這個數字發到外部成程序,這個外部程序echo回來數字,收到echo回來的消息后,把數字減1,繼續傳遞.當數字減少到0的時候 銷毀整個ring.
root@nd-desktop:~/test#ulimit -n 1024 /* 注意這個數字非常重要 它影響了Erlang程序3個地方 1. epoll的句柄集大小 2. MAX_PORT 以及port的表格大小 3. open_port的時候 子進程關閉的文件句柄大小*/
root@nd-desktop:~/test# cat pipe_ring.erl
-module(pipe_ring).
-export([start/1]).
-export([make_relay/1, run/3]).
make_relay(Next)->
Port = open_port({spawn, "/bin/cat"}, [in, out, {line, 128}]),
relay_loop(Next, Port).
relay_loop(Next, Port) ->
receive
{Port, {data, {eol, Line}}} ->
Next ! (list_to_integer(Line) - 1),
relay_loop(Next, Port);
K when is_integer(K) andalso K > 0 ->
port_command(Port, [integer_to_list(K), "\n"]),
relay_loop(Next, Port);
K when is_integer(K) andalso K =:=0 ->
port_close(Port),
Next ! K
end.
build_ring(K, Current, N, F) when N > 1 ->
build_ring(K, spawn(?MODULE, make_relay, [Current]), N - 1, F);
build_ring(_, Current, _, F) ->
F(),
make_relay(Current).
run(N, K, Par) ->
Parent = self(),
Cs = [spawn(fun ()-> Parent!run1(N, K, P) end) || P<-lists:seq(1, Par)],
[receive _-> ok end || _<-Cs].
run1(N, K, P)->
T1 = now(),
build_ring(K, self(), N, fun ()-> io:format("(ring~w setup time: ~ws)~n", [P, timer:now_diff(now(), T1) /1000]), self() ! K end).
start(Args) ->
Args1 = [N, K, Par] = [list_to_integer(atom_to_list(X)) || X<-Args],
{Time, _} = timer:tc(?MODULE, run, Args1),
io:format("(total run (N:~w K:~w Par:~w) ~wms ~w/s)~n", [N, K, Par, round(Time/1000), round(K*Par*1000000/Time)]),
halt(0).
root@nd-desktop:~/test# erl +Bd -noshell +K true -smp disable -s pipe_ring start 10 100000 8
(ring1 setup time: 0.021s)
(ring2 setup time: 0.02s)
(ring3 setup time: 0.019s)
(ring4 setup time: 0.03s)
(ring5 setup time: 0.018s)
(ring6 setup time: 0.031s)
(ring7 setup time: 0.027s)
(ring8 setup time: 0.039s)
(total run (N:10 K:100000 Par:8) 23158ms 34546/s)
參數的意義:
N K Par
N:ring有幾個環 每個環開一個port
K:每個環傳遞多少消息
Par: 多少ring一起跑
總的消息數是 K * Par.
我們可以看到 每秒可以處理大概 3.4W個消息 我有2個核心. 也就是說每個消息的開銷大概是 30us. 每個port的創建時間不算多, 1ms一個.
root@nd-desktop:~/test# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
33 18 50 0 0 1| 0 0 | 438B 2172B| 0 0 |5329 33k
42 11 48 0 0 0| 0 0 | 212B 404B| 0 0 |5729 58k
41 11 49 0 0 0| 0 0 | 244B 1822B| 0 0 |5540 59k
40 11 49 0 0 0| 0 0 | 304B 404B| 0 0 |4970 60k
注意上面的csw 達到6W每秒.
root@nd-desktop:~/test# pstree
├─sshd─┬─sshd─┬─bash───pstree
│ │ └─bash───man───pager
│ ├─sshd───bash─┬─beam─┬─80*[cat]
│ │ │ └─{beam}
│ │ └─emacs
│ ├─sshd───bash───emacs
│ └─sshd───bash───nmon
我們運行了80個echo程序(/bin/cat)
讀者有興趣的話可以用systemtap 詳細了解 pipe的讀寫花費,以及context_switch情況, 具體腳本可以向我索要.
root@nd-desktop:~# cat /proc/cpuinfo
processor : 1
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 : 1
cpu cores : 2
apicid : 1
initial apicid : 1
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 em
bogomips : 4987.44
clflush size : 64
power management:
結論是: 用port的這種架構的開銷是可以接受的.
我設計了個這樣的ring. 每個ring有N個環組成, 每個環開個port. 當ring收到個數字的時候 如果數字不為0, 那么把這個數字發到外部成程序,這個外部程序echo回來數字,收到echo回來的消息后,把數字減1,繼續傳遞.當數字減少到0的時候 銷毀整個ring.
root@nd-desktop:~/test#ulimit -n 1024 /* 注意這個數字非常重要 它影響了Erlang程序3個地方 1. epoll的句柄集大小 2. MAX_PORT 以及port的表格大小 3. open_port的時候 子進程關閉的文件句柄大小*/
root@nd-desktop:~/test# cat pipe_ring.erl
-module(pipe_ring).
-export([start/1]).
-export([make_relay/1, run/3]).
make_relay(Next)->
Port = open_port({spawn, "/bin/cat"}, [in, out, {line, 128}]),
relay_loop(Next, Port).
relay_loop(Next, Port) ->
receive
{Port, {data, {eol, Line}}} ->
Next ! (list_to_integer(Line) - 1),
relay_loop(Next, Port);
K when is_integer(K) andalso K > 0 ->
port_command(Port, [integer_to_list(K), "\n"]),
relay_loop(Next, Port);
K when is_integer(K) andalso K =:=0 ->
port_close(Port),
Next ! K
end.
build_ring(K, Current, N, F) when N > 1 ->
build_ring(K, spawn(?MODULE, make_relay, [Current]), N - 1, F);
build_ring(_, Current, _, F) ->
F(),
make_relay(Current).
run(N, K, Par) ->
Parent = self(),
Cs = [spawn(fun ()-> Parent!run1(N, K, P) end) || P<-lists:seq(1, Par)],
[receive _-> ok end || _<-Cs].
run1(N, K, P)->
T1 = now(),
build_ring(K, self(), N, fun ()-> io:format("(ring~w setup time: ~ws)~n", [P, timer:now_diff(now(), T1) /1000]), self() ! K end).
start(Args) ->
Args1 = [N, K, Par] = [list_to_integer(atom_to_list(X)) || X<-Args],
{Time, _} = timer:tc(?MODULE, run, Args1),
io:format("(total run (N:~w K:~w Par:~w) ~wms ~w/s)~n", [N, K, Par, round(Time/1000), round(K*Par*1000000/Time)]),
halt(0).
root@nd-desktop:~/test# erl +Bd -noshell +K true -smp disable -s pipe_ring start 10 100000 8
(ring1 setup time: 0.021s)
(ring2 setup time: 0.02s)
(ring3 setup time: 0.019s)
(ring4 setup time: 0.03s)
(ring5 setup time: 0.018s)
(ring6 setup time: 0.031s)
(ring7 setup time: 0.027s)
(ring8 setup time: 0.039s)
(total run (N:10 K:100000 Par:8) 23158ms 34546/s)
參數的意義:
N K Par
N:ring有幾個環 每個環開一個port
K:每個環傳遞多少消息
Par: 多少ring一起跑
總的消息數是 K * Par.
我們可以看到 每秒可以處理大概 3.4W個消息 我有2個核心. 也就是說每個消息的開銷大概是 30us. 每個port的創建時間不算多, 1ms一個.
root@nd-desktop:~/test# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
33 18 50 0 0 1| 0 0 | 438B 2172B| 0 0 |5329 33k
42 11 48 0 0 0| 0 0 | 212B 404B| 0 0 |5729 58k
41 11 49 0 0 0| 0 0 | 244B 1822B| 0 0 |5540 59k
40 11 49 0 0 0| 0 0 | 304B 404B| 0 0 |4970 60k
注意上面的csw 達到6W每秒.
root@nd-desktop:~/test# pstree
├─sshd─┬─sshd─┬─bash───pstree
│ │ └─bash───man───pager
│ ├─sshd───bash─┬─beam─┬─80*[cat]
│ │ │ └─{beam}
│ │ └─emacs
│ ├─sshd───bash───emacs
│ └─sshd───bash───nmon
我們運行了80個echo程序(/bin/cat)
讀者有興趣的話可以用systemtap 詳細了解 pipe的讀寫花費,以及context_switch情況, 具體腳本可以向我索要.
root@nd-desktop:~# cat /proc/cpuinfo
processor : 1
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 : 1
cpu cores : 2
apicid : 1
initial apicid : 1
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 em
bogomips : 4987.44
clflush size : 64
power management:
結論是: 用port的這種架構的開銷是可以接受的.
评论
2 楼
mryufeng
2009-09-14
linux thread switch 19us 所以大量的csw是高性能的杀手!
1 楼
joshzhu
2009-09-14
文章很赞。这下可以安心的用port了。
发表评论
-
OTP R14A今天发布了
2010-06-17 14:36 2677以下是这次发布的亮点,没有太大的性能改进, 主要是修理了很多B ... -
R14A实现了EEP31,添加了binary模块
2010-05-21 15:15 3030Erlang的binary数据结构非常强大,而且偏向底层,在作 ... -
如何查看节点的可用句柄数目和已用句柄数
2010-04-08 03:31 4814很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
获取Erlang系统信息的代码片段
2010-04-06 21:49 3475从lib/megaco/src/tcp/megaco_tcp_ ... -
iolist跟list有什么区别?
2010-04-06 20:30 6529看到erlang-china.org上有个 ... -
erlang:send_after和erlang:start_timer的使用解释
2010-04-06 18:31 8386前段时间arksea 同学提出这个问题, 因为文档里面写的很不 ... -
Latest news from the Erlang/OTP team at Ericsson 2010
2010-04-05 19:23 2013参考Talk http://www.erlang-factor ... -
对try 异常 运行的疑问,为什么出现两种结果
2010-04-05 19:22 2842郎咸武<langxianzhe@163.com> ... -
Erlang ERTS Async基础设施
2010-03-19 00:03 2517其实Erts的Async做的很不错的, 相当的完备, 性能又高 ... -
CloudI 0.0.9 Released, A Cloud as an Interface
2010-03-09 22:32 2476基于Erlang的云平台 看了下代码 质量还是不错的 完成了不 ... -
Memory matters - even in Erlang (再次说明了了解内存如何工作的必要性)
2010-03-09 20:26 3439原文地址:http://www.lshift.net/blog ... -
Some simple examples of using Erlang’s XPath implementation
2010-03-08 23:30 2050原文地址 http://www.lshift.net/blog ... -
lcnt 环境搭建
2010-02-26 16:19 2614抄书:otp_doc_html_R13B04/lib/tool ... -
Erlang强大的代码重构工具 tidier
2010-02-25 16:22 2486Jan 29, 2010 We are very happy ... -
[Feb 24 2010] Erlang/OTP R13B04 has been released
2010-02-25 00:31 1387Erlang/OTP R13B04 has been rele ... -
R13B04 Installation
2010-01-28 10:28 1390R13B04后erlang的源码编译为了考虑移植性,就改变了编 ... -
Running tests
2010-01-19 14:51 1486R13B03以后 OTP的模块加入了大量的测试模块,这些模块都 ... -
R13B04在细化Binary heap
2010-01-14 15:11 1508从github otp的更新日志可以清楚的看到otp R13B ... -
R13B03 binary vheap有助减少binary内存压力
2009-11-29 16:07 1668R13B03 binary vheap有助减少binary内存 ... -
erl_nif 扩展erlang的另外一种方法
2009-11-26 01:02 3218我们知道扩展erl有2种方法, driver和port. 这2 ...
相关推荐
"DisplayPort一致性测试的完整解决方案" ...DisplayPort一致性测试需要功能强大的测试仪器及详细测试程序,泰克提供了完整的自动化测试方案,简化了测试过程,提高了测试效率,提供了可靠的测试结果。
AccessPort137是一款专为硬件工程师设计的串口测试工具,它在IT行业中扮演着不可或缺的角色,尤其对于那些需要进行串行通信调试的开发者来说,更是得力的助手。串口测试是验证硬件设备之间数据传输正确性的关键步骤...
"Portm串口测试"是一个针对串行端口进行诊断和验证的专题,旨在确保设备之间的串口通信功能正常。在本文中,我们将深入探讨串口通信的基础知识、Portm98软件的使用以及如何进行有效的串口测试。 首先,我们需要理解...
"accessport串口测试工具"就是专为串口通信测试和调试设计的一款软件。本文将深入探讨串口通信的基本概念,accessport工具的功能特性,以及如何使用该工具进行有效的串口测试和调试。 首先,串口通信,也称为串行...
### JMeter性能测试白皮书知识点详解 #### 线程组配置 在JMeter中,**线程组**是构建任何性能测试的基础组件之一,它定义了虚拟用户的集合及其行为模式。 - **线程数(模拟用户数)**:表示在测试中模拟的用户数量...
### 软件性能测试与LoadRunner实践 #### 一、软件性能测试概述 软件性能测试是一种通过模拟实际用户操作场景来验证软件系统的性能是否满足预期目标的过程。它旨在评估软件在不同负载条件下的表现,确保软件能够在...
### Port-Channel技术详解 #### 一、Port-Channel技术的意义 ...总之,Port-Channel技术对于提高网络性能和可靠性至关重要。通过合理的配置和管理,可以充分发挥其优势,为用户提供更加稳定和高效的网络服务。
V93000测试平台,一种设计用于测试高速、高精度SOC(System On Chip)的芯片测试平台,为FPGA测试提供了新的下载方法。该平台的每根通道都拥有独立的向量存储、施加和测量单元,这就是所谓的Per-Pin结构。在Multi-...
【Port1.0并口测试示波软件】是一款专门用于并行端口(Parallel Port)检测与调试的专业工具。在IT领域,尤其是在硬件维护、嵌入式系统开发以及电子工程中,这种软件扮演着至关重要的角色。并口,也称为LPT端口,是...
《电脑串口测试调试软件ComPort深度解析》 在计算机技术领域,串行通信是一种重要的数据传输方式,尤其是在工业控制、物联网设备以及嵌入式系统中广泛应用。串口,即串行接口,是电脑硬件中一种古老的通信接口,...
6. **发送与接收测试**:Porttest可以发送预设的字符或数据流到选定的串口,并同时接收来自该端口的数据,进行双向通信测试,帮助排查硬件或软件问题。 7. **实时数据显示**:在测试过程中,Porttest会实时显示接收...
- **疲劳强度性能测试**:长时间连续运行系统,以检测系统在高负载条件下的稳定性和可靠性。 - **大数据量性能测试**:测试系统在处理大量数据时的表现,评估其扩展能力和数据处理效率。 - **网络性能测试**:评估...
Sysbench是一款开源的多线程性能测试工具,广泛用于评估Linux系统的CPU、内存、I/O等子系统的性能。本文将详细介绍sysbench-1.0.18的下载、安装过程,以及如何编写和执行测试脚本来进行性能评估。 首先,我们需要...
《XXX金融项目性能测试脚本开发详解》 在金融行业中,系统的稳定性和高效性是至关重要的,这需要通过性能测试来验证。本文将详细介绍XXX金融项目的性能测试脚本开发过程,涉及用户登录、固价下单业务场景以及相关...
Port Groper测试结果可以帮助安全团队识别出可能的薄弱环节,例如长时间未响应的端口、异常高的响应时间或服务崩溃。一旦发现问题,可以采取相应的加固措施,如优化服务器配置、更新软件补丁、实施防火墙策略等,以...
PIPE协议广泛应用于PCI Express、SATA(Serial ATA)、USB 3.1、DisplayPort和Converged IO(综合IO)架构中,其5.1版本由Intel公司发布。该协议的具体内容包括了有关PHY接口的技术规范和操作要求,主要针对硬件设计...
- DisplayPort 1.2引入了节能特性,如Low Power DisplayPort(LPP)和Link Power State(LPS),能够在不牺牲性能的情况下降低功耗,符合现代设备对节能的要求。 DisplayPort 1.2技术的这些改进,使其成为专业图形...