`
xumingyong
  • 浏览: 182332 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

转载:http://www.lupaworld.com/action-viewstutorial-itemid-10191.html

 

 

前些天给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%左右。 内存也不是很大~~

分享到:
评论

相关推荐

    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