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

erlang网络编程的几个性能调优和注意点

阅读更多
前些天给echo_server写了个非常简单的连接压力测试程序,
代码
 
  1. -module(stress_test).  
  2.   
  3. -export([start/0, tests/1]).  
  4.   
  5. start() ->  
  6.     tests(12345).  
  7.   
  8. tests(Port) ->  
  9.     io:format("starting~n"),  
  10.     spawn(fun() -> test(Port) end),  
  11.     spawn(fun() -> test(Port) end),  
  12.     spawn(fun() -> test(Port) end),  
  13.     spawn(fun() -> test(Port) end).  
  14.   
  15. test(Port) ->  
  16.      case gen_tcp:connect("192.168.0.217", Port, [binary,{packet, 0}]) of  
  17.     {ok, _} ->  
  18.             test(Port);  
  19.     _ ->  
  20.         test(Port)  
  21.     end.  
一开始我的这个stress_test客户端运行在windows上面, echo_server服务器端运行在linux上面。 结果接受了1016个连接就停止了. 于是我用ulimit -n 改了服务器端的文件描述符数量为10240. 接着还是如此,折腾了几天,最终还是没有搞明白。

于是就求助于公司的linux编程牛人,结果让我一倒...  客户端没有修改文件描述符个数. windows上得在注册表里面改.
牛人开始对这东西的性能感兴趣了,刚好我摸了一阵子erlang的文档,于是我俩就走向了erlang网络连接的性能调优之旅啦~~过程真是让人兴奋。 我们很快通过了1024这一关~~到了4999个连接,很兴奋.

但为什么4999个连接呢, 检查一下代码终于发现echo_server.erl定义了一个宏, 最大连接数为5000. 我又倒~~
修改编译之后, 连接数跑到101xx多了, 太哈皮了!
再测102400个连接时,到32767个连接数erl挂了~说是进程开得太多了. 好在记得这个erl的参数+P,可以定义erlang能生成的进程数. 默认是32768. 改了!

后面不知怎么着,在81231个连接停止了. 新的性能瓶颈又卡了我们.  好在牛人对linux熟, 用strace(这东西会莫名地退出), stap查出一些苗头.   我也想到在otp文档好像提过另一个limit,那就是端口数...在此同时我们发现erlang在linux上是用的传统poll模型. 但查erlang的源代码发现是支持epoll的. 在网上搜了半天,终于搜到了个maillist的帖子.

代码
  1. $./configure --enable-kernel-poll  

由于我们的测试服务器是双核的,我们在配置的时候也打开了smp支持.  欢快的make  & make install之后....
把 /proc/sys/net/ipv4/ip_local_port_range 的内容改成了1024到65535.  最多也也能改成65535 :)

代码
  1. $echo 1024 65535 > ip_local_port_range  

另外再添加一个erl的环境变量
代码
  1. $export ERL_MAX_PORTS=102400  

于是开始跑了,不过这次跑不一样了
echo_server
 
  1. $erl -noshell  +P 102400 +K true +S 2 -smp -s echo_server start  
   
stress_test
 
  1. $erl -noshell  +P 102400 +K true +S 2 -smp -s stress_test start  
这里的+K true,表示使用内核poll,+S 2 表示两个核. 这样可欢快啦~~~ 10w大关过咯! 而且比刚才没用epoll的速度快暴多~~
于是我们又开始了204800个连接发测试了~~~

用top一看cpu占用率极低,服务器只在5%左右。 内存也不是很大~~
分享到:
评论
8 楼 laputa73 2013-09-24  
chuqingq 写道
有个疑问,端口数最多不超过65536个,为什么测试结果能达到20万连接?

因为libevent,允许一个端口同时支持多个连接挂起
7 楼 chuqingq 2012-11-04  
有个疑问,端口数最多不超过65536个,为什么测试结果能达到20万连接?
6 楼 laputa73 2012-08-15  
oyscal 写道
引用
客户端没有修改文件描述符个数. windows上得在注册表里面改

请问是怎么改的?

同问,搜了半天,没找到。停在1019了
5 楼 oyscal 2007-11-16  
引用
客户端没有修改文件描述符个数. windows上得在注册表里面改

请问是怎么改的?
4 楼 mryufeng 2007-10-22  
+A +a 来多开几个线程来协助加快inet_tcp driver的速度估计也有帮助。

http://mryufeng.iteye.com
3 楼 qiezi 2007-07-12  
谢谢。erl不接受--help,没想到epmd接受这个。epmd的端口可以修改了。

关于节点的端口范围,刚刚搜到一个:
http://avindev.iteye.com/blog/98212
2 楼 coderplay 2007-07-10  
usage: epmd [-d|-debug] [DbgExtra...] [-port No] [-daemon]
            [-d|-debug] [-port No] [-names|-kill]

See the Erlang epmd manual page for info about the usage.
The -port and DbgExtra options are

    -port No
        Let epmd listen to another port than default 4369
    -d
    -debug
        Enable debugging. This will give a log to
        the standard error stream. It will shorten
        the number of saved used node names to 5.

        If you give more than one debug flag you may
        get more debugging information.

    -packet_timout Seconds
        Set the number of seconds a connection can be
        inactive before epmd times out and closes the
        connection (default 60).

    -delay_accept Seconds
        To simulate a busy server you can insert a
        delay between epmd gets notified about that
        a new connection is requested and when the
        connections gets accepted.

    -delay_write Seconds
        Also a simulation of a busy server. Inserts
        a delay before a reply is sent.
看上面的帮助
1 楼 qiezi 2007-07-08  
问个小问题:
有没有办法指定epmd监听的端口?有没有办法指定节点(node)监听的端口范围?

相关推荐

    poolboy erlang

    在Erlang这种并发性极强的编程语言中,线程池的概念同样重要,它可以帮助开发者有效地管理和调度并发进程,提高系统的响应速度和整体性能。 线程池是一种进程管理机制,它预先创建了一组工作进程,当有新的任务到来...

    Erlang.and.OTP.实战

    4. **错误处理和监控**:如Observer工具,帮助开发者监视系统状态,进行故障诊断和性能调优。 5. **分布式能力**:Erlang节点间可以轻松通信,支持构建分布式应用。 通过阅读《Erlang 和 OTP 实战》,你将学习如何...

    Manning.Erlang.and.OTP.in.Action.May.2010.MEAP.rar

    这本书深入探讨了Erlang编程语言及其相关的 OTP(Open Telecom Platform)框架。 Erlang是一种并发、分布式和容错的编程语言,由爱立信公司于1986年为电话交换系统开发。它的设计目标是处理大规模并发连接,提供高...

    一个用Erlang公告板系统在一个局域网内构造 BBS 集群,

    在局域网内构建BBS集群,我们需要考虑以下几个关键知识点: 1. **分布式节点设置**:Erlang节点可以通过启动时指定主机名和节点名称来连接到其他节点。为了在局域网中构建集群,我们需要确保所有服务器上都有Erlang...

    服务器测试.zip

    学习Erlang服务器开发,我们需要掌握以下几个关键知识点: 1. **进程和并发**:理解Erlang中的进程概念,如何创建和通信,以及如何通过进程间的同步和异步交互来实现并发执行。 2. **模式匹配**:Erlang的函数调用...

    otp_win64_22.0.exe下载

    对于学习Erlang和OTP,了解以下几点至关重要: 1. 并发模型:Erlang中的进程是轻量级的,创建和销毁都非常快,使得系统能够轻松处理大量并发连接。 2. 错误处理:通过模式匹配和异常处理,Erlang鼓励程序员编写无副...

    Is Parallel Programming Hard [v20191222a # Paul E. McKenney].pdf

    历史上的并行编程困难主要来源于以下几个方面: 1. 理论困难:并行算法的设计需要考虑很多理论上复杂的问题,比如进程同步、资源竞争、死锁避免等。 2. 技术挑战:并行计算架构的多样性和复杂性导致编程模型、编程...

    otp-win64-25.1.2 rabbitmq-server-3.11.2

    结合以上信息,我们可以探讨以下几个知识点: 1. **Erlang OTP**: Erlang是一种函数式编程语言,OTP是其核心组成部分,提供了一整套开发框架和库,包括进程管理、分布式计算、错误恢复等。了解Erlang OTP可以帮助...

    rabbitmq.rar

    RabbitMQ是一款开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中,...记得在部署过程中关注系统的安全配置和性能调优,以确保RabbitMQ在生产环境中的稳定运行。

    大数据的Reactive设计范式和Akka实践.pdf

    4. **性能调优**:在传统架构下,性能调优往往涉及到复杂的代码更改和重构。而Reactive架构通过其独特的设计理念,使得开发者能够在不影响现有业务逻辑的情况下,更加灵活高效地进行性能优化。 #### 二、Reactive...

Global site tag (gtag.js) - Google Analytics