`
mryufeng
  • 浏览: 982321 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

高強度的port(Pipe)的性能測試

阅读更多
在我的項目里面, 很多運算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的這種架構的開銷是可以接受的.


分享到:
评论
2 楼 mryufeng 2009-09-14  
linux thread switch 19us  所以大量的csw是高性能的杀手!
1 楼 joshzhu 2009-09-14  
文章很赞。这下可以安心的用port了。

相关推荐

    DisplayPort一致性测试的完整解决方案[收集].pdf

    "DisplayPort一致性测试的完整解决方案" ...DisplayPort一致性测试需要功能强大的测试仪器及详细测试程序,泰克提供了完整的自动化测试方案,简化了测试过程,提高了测试效率,提供了可靠的测试结果。

    AccessPort137串口测试工具

    AccessPort137是一款专为硬件工程师设计的串口测试工具,它在IT行业中扮演着不可或缺的角色,尤其对于那些需要进行串行通信调试的开发者来说,更是得力的助手。串口测试是验证硬件设备之间数据传输正确性的关键步骤...

    Portm串口测试

    "Portm串口测试"是一个针对串行端口进行诊断和验证的专题,旨在确保设备之间的串口通信功能正常。在本文中,我们将深入探讨串口通信的基础知识、Portm98软件的使用以及如何进行有效的串口测试。 首先,我们需要理解...

    accessport串口测试工具

    "accessport串口测试工具"就是专为串口通信测试和调试设计的一款软件。本文将深入探讨串口通信的基本概念,accessport工具的功能特性,以及如何使用该工具进行有效的串口测试和调试。 首先,串口通信,也称为串行...

    jmeter性能测试白皮书

    ### JMeter性能测试白皮书知识点详解 #### 线程组配置 在JMeter中,**线程组**是构建任何性能测试的基础组件之一,它定义了虚拟用户的集合及其行为模式。 - **线程数(模拟用户数)**:表示在测试中模拟的用户数量...

    软件性能测试与LoadRunner实践.pdf

    ### 软件性能测试与LoadRunner实践 #### 一、软件性能测试概述 软件性能测试是一种通过模拟实际用户操作场景来验证软件系统的性能是否满足预期目标的过程。它旨在评估软件在不同负载条件下的表现,确保软件能够在...

    port-channel测试报告

    ### Port-Channel技术详解 #### 一、Port-Channel技术的意义 ...总之,Port-Channel技术对于提高网络性能和可靠性至关重要。通过合理的配置和管理,可以充分发挥其优势,为用户提供更加稳定和高效的网络服务。

    用于测试FPGA的Multi-Port下载方式.pdf

    V93000测试平台,一种设计用于测试高速、高精度SOC(System On Chip)的芯片测试平台,为FPGA测试提供了新的下载方法。该平台的每根通道都拥有独立的向量存储、施加和测量单元,这就是所谓的Per-Pin结构。在Multi-...

    Port1.0并口测试示波软件

    【Port1.0并口测试示波软件】是一款专门用于并行端口(Parallel Port)检测与调试的专业工具。在IT领域,尤其是在硬件维护、嵌入式系统开发以及电子工程中,这种软件扮演着至关重要的角色。并口,也称为LPT端口,是...

    电脑串口测试调试软件ComPort

    《电脑串口测试调试软件ComPort深度解析》 在计算机技术领域,串行通信是一种重要的数据传输方式,尤其是在工业控制、物联网设备以及嵌入式系统中广泛应用。串口,即串行接口,是电脑硬件中一种古老的通信接口,...

    串口测试工具 porttest

    6. **发送与接收测试**:Porttest可以发送预设的字符或数据流到选定的串口,并同时接收来自该端口的数据,进行双向通信测试,帮助排查硬件或软件问题。 7. **实时数据显示**:在测试过程中,Porttest会实时显示接收...

    性能测试经验总结资料,适宜初学和中级(由于是公司内部资料,不想花分勿下)

    - **疲劳强度性能测试**:长时间连续运行系统,以检测系统在高负载条件下的稳定性和可靠性。 - **大数据量性能测试**:测试系统在处理大量数据时的表现,评估其扩展能力和数据处理效率。 - **网络性能测试**:评估...

    性能测试sysbench.rar

    Sysbench是一款开源的多线程性能测试工具,广泛用于评估Linux系统的CPU、内存、I/O等子系统的性能。本文将详细介绍sysbench-1.0.18的下载、安装过程,以及如何编写和执行测试脚本来进行性能评估。 首先,我们需要...

    XXX 金融项目性能测试脚本开发

    《XXX金融项目性能测试脚本开发详解》 在金融行业中,系统的稳定性和高效性是至关重要的,这需要通过性能测试来验证。本文将详细介绍XXX金融项目的性能测试脚本开发过程,涉及用户登录、固价下单业务场景以及相关...

    拒绝服务测试工具 Port Groper

    Port Groper测试结果可以帮助安全团队识别出可能的薄弱环节,例如长时间未响应的端口、异常高的响应时间或服务崩溃。一旦发现问题,可以采取相应的加固措施,如优化服务器配置、更新软件补丁、实施防火墙策略等,以...

    pipe接口协议

    PIPE协议广泛应用于PCI Express、SATA(Serial ATA)、USB 3.1、DisplayPort和Converged IO(综合IO)架构中,其5.1版本由Intel公司发布。该协议的具体内容包括了有关PHY接口的技术规范和操作要求,主要针对硬件设计...

    Display_Port_1.2.zip_Display 1.2_DisplayPort1.2_display port_dis

    - DisplayPort 1.2引入了节能特性,如Low Power DisplayPort(LPP)和Link Power State(LPS),能够在不牺牲性能的情况下降低功耗,符合现代设备对节能的要求。 DisplayPort 1.2技术的这些改进,使其成为专业图形...

Global site tag (gtag.js) - Google Analytics