Joel Reymont对Erlang的抱怨
程序员文章站
2022-07-15 08:19:36
...
Joel Reymont开发了OpenPoker─一个有超强伸缩性的在线多游戏玩家系统,翻译见这里。
“OpenPoker是一个超强多玩家纸牌服务器,具有容错、负载均衡和无限伸缩性等特性。源代码位于我的个人站点上,大概10,000行代码,其中1/3是测试代码。”
他昨天在Erlang论坛强烈的抱怨Erlang的一些缺陷。在他自己的blog上,他使用了更强烈的词表达了他的不满:Erlang sucks,而且还带着一个感叹号!
他主要抱怨了Erlang的支持工具不够,当他成功的用Erlang开发了一个超稳定超可伸缩的游戏服务器OpenPoker后,玩家数量不断增长,他也计划给游戏添加更多的功能,例如一个Flash客户端。这时他遇到了麻烦,他开发用的工作站是一个Mac Pro 2x2.8Ghz Quad Xeon,12G内存,1T多硬盘空间,7200RPM SATA,Erlang/OTP是R12B3, SMP 和kernel poll。参数如下:
5.6.3 [source] [64-bit] [smp:8] [async-threads:0] [kernel-poll:true]
他的麻烦之一是:他做不到透明的运行Erlang系统。没有像样的工具可以内部监视系统(peering inside),没有一个可用的工具。
使用别的语言我们可以剖析(profile)系统、修改系统、评估系统性能以作评价,但是Erlang不行。
刚开始开发OpenPoker时,他到处用到了OTP,玩家、游戏、底池(玩家们的下注形成的,供最后的赢家获得)等等统统都是gen_server线程。几乎到处都使用到了Mnesia事务。
随后发现当有2~3千的玩家同时在线玩的时候遇到了问题。
他使用了专门的测试: 释放上千个机器人连接服务器然后根据脚本进行游戏。但他想在一个服务器集群的数十万个VM上,每个单独VM上有更多的(上万个)机器人进行测试,这样便于找出问题优化系统。
Erlang Efficiency Guide建议使用fprof作为工具。他运行了这个工具,发现运行的结果集不能在他的12G内存的机器上进行处理。这是在fprof工具运行数天后发现的,因为fprof数据文件将近100G大小,由于频繁的swapping使机器变得不稳定。
fprof使用ets表分析追踪结果,而ets表必须都装载到内存里。
他不得不简化了他的测试以便能使用fprof分析结果。
最终的fprof数据仍然太原始分析起来困难重重。没有好的办法通过得到运行时系统的状态。他只能大概的推断出:也许他用到的线程过多导致的问题。
他还认为写gen_server代码不利于系统剖析(profiling),他不得不重写gen_server clouse。
他把gen_server作为数据结构,例如底池、limit、牌堆等。一个牌堆可以接收消息划出一张牌,这个消息就像是一个函数调用。
他还谈到了Mnesia表和ets的问题
最后他悲观的认为他很难将他的系统扩展到能容纳10万用户的规模。
“OpenPoker是一个超强多玩家纸牌服务器,具有容错、负载均衡和无限伸缩性等特性。源代码位于我的个人站点上,大概10,000行代码,其中1/3是测试代码。”
他昨天在Erlang论坛强烈的抱怨Erlang的一些缺陷。在他自己的blog上,他使用了更强烈的词表达了他的不满:Erlang sucks,而且还带着一个感叹号!
他主要抱怨了Erlang的支持工具不够,当他成功的用Erlang开发了一个超稳定超可伸缩的游戏服务器OpenPoker后,玩家数量不断增长,他也计划给游戏添加更多的功能,例如一个Flash客户端。这时他遇到了麻烦,他开发用的工作站是一个Mac Pro 2x2.8Ghz Quad Xeon,12G内存,1T多硬盘空间,7200RPM SATA,Erlang/OTP是R12B3, SMP 和kernel poll。参数如下:
5.6.3 [source] [64-bit] [smp:8] [async-threads:0] [kernel-poll:true]
他的麻烦之一是:他做不到透明的运行Erlang系统。没有像样的工具可以内部监视系统(peering inside),没有一个可用的工具。
使用别的语言我们可以剖析(profile)系统、修改系统、评估系统性能以作评价,但是Erlang不行。
刚开始开发OpenPoker时,他到处用到了OTP,玩家、游戏、底池(玩家们的下注形成的,供最后的赢家获得)等等统统都是gen_server线程。几乎到处都使用到了Mnesia事务。
随后发现当有2~3千的玩家同时在线玩的时候遇到了问题。
他使用了专门的测试: 释放上千个机器人连接服务器然后根据脚本进行游戏。但他想在一个服务器集群的数十万个VM上,每个单独VM上有更多的(上万个)机器人进行测试,这样便于找出问题优化系统。
Erlang Efficiency Guide建议使用fprof作为工具。他运行了这个工具,发现运行的结果集不能在他的12G内存的机器上进行处理。这是在fprof工具运行数天后发现的,因为fprof数据文件将近100G大小,由于频繁的swapping使机器变得不稳定。
fprof使用ets表分析追踪结果,而ets表必须都装载到内存里。
他不得不简化了他的测试以便能使用fprof分析结果。
最终的fprof数据仍然太原始分析起来困难重重。没有好的办法通过得到运行时系统的状态。他只能大概的推断出:也许他用到的线程过多导致的问题。
他还认为写gen_server代码不利于系统剖析(profiling),他不得不重写gen_server clouse。
他把gen_server作为数据结构,例如底池、limit、牌堆等。一个牌堆可以接收消息划出一张牌,这个消息就像是一个函数调用。
他还谈到了Mnesia表和ets的问题
最后他悲观的认为他很难将他的系统扩展到能容纳10万用户的规模。
上一篇: html禁止清除input文本输入缓存