阅读更多

8顶
0踩

非技术

原创新闻 Joel Reymont对Erlang的抱怨

2008-09-13 09:09 by 见习记者 cryolite 评论(8) 有12629人浏览
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万用户的规模。
8
0
评论 共 8 条 请登录后发表评论
8 楼 wenew 2008-09-24 08:47
我看过openpoker早期代码,
Joel Reymont的没有将一个游戏系统很好的分成不同的子系统,
他那样的作法,无论使用哪种语言,到最后系统扩展起来,都会有很多的麻烦,
而一遇到麻烦,可能很难解决,
Erlang可以使用在电信上,为什么这样一个游戏系统都不能达到10K并发?Joel在系统规划上没有足够的经验,或者说没有足够调查分析,
“他到处用到了OTP,玩家、游戏、底池(玩家们的下注形成的,供最后的赢家获得)等等统统都是gen_server线程”
这样的方法本身就是问题,
它使用OO的思想做ERLANG,就是一个方向性的错误,erlang是不支持OO的,
对于Mnesia的过分依赖。。。
当然,openpoker也是有许多优点的。我有所借鉴
gtk:wenewboy at gmail.com
7 楼 meng9999 2008-09-13 21:14
继续关注吧, 什么事情都有尝试的时候!
程序员都是在折腾中享受和成长;



6 楼 七猫 2008-09-13 19:28
天堂的服务器好像是用Java做的

c++,写得比较牛。
5 楼 xsc963 2008-09-13 14:54
引用
不在敏捷上面意淫。 盛大,征途,网易这么多大的公司都是使用C,C++做的服务器端。没有哪家感冒险使用java,使用python做; 为什么? 只有网络的一些个人用户
总是号称使用python,erlang开发了一个游戏服务器端;
天堂的服务器好像是用Java做的
4 楼 cryolite 2008-09-13 14:52
现在的话题转向了操作系统,开始怀疑OpenPoker不能支持更多的用户是因为Mac OSX的问题了,而不是Erlang的问题,有人在linux下测试发现OpenPoker表现优异:
under linux, we got to 100k users on 2 ec2 (c1.medium) game servers + 1 dedicated mnesia master.

Joel考虑把测试环境换成Amazon EC2

讨论中还提到了Erlang DTrace

进一步关注中。。。。。。
3 楼 cryolite 2008-09-13 14:06
首先,Joel Reymont不是一个团队
其次,Like any technical project you are dealt a hand and you have to play  
2 楼 meng9999 2008-09-13 12:23
我们老是在找Erlang,python,ruby方面的语言去验证是否可以取代C,C++,JAVA在服务器端的使用的时候,我们是不是想想回到传统的C,C++,java上面,好好做服务器端
。不在敏捷上面意淫。 盛大,征途,网易这么多大的公司都是使用C,C++做的服务器端。没有哪家感冒险使用java,使用python做; 为什么? 只有网络的一些个人用户
总是号称使用python,erlang开发了一个游戏服务器端;
分析一下:也许个人开发者更喜欢自已选择开发语言。
团队必须需要比较成熟的方案。要不损失就比较大了。

1 楼 meng9999 2008-09-13 12:16
在新互联网环境下面使用古老的Erlang语言的验证者致敬!
在我们使用一种新的语言的时候,希望得到更多的数据和项目
表明它是否可以取代C,C++,JAVA作为服务器更好的语言;


发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • java实现即时通讯软件

    导读:即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,swing技术等进行实际开发相对比较合适。通过一些轻松的注册登录后,在局域网中即时聊天便可以成功进行。 目录 项目结构: 项目截图: 总结: 下载地址: 项目结构: 项目截图: 总结: 随着信息社会的快速发展,网络作为改变世界的最重要的因素。众多的企业纷纷使用局...

  • java服务器c 客户端程序_求一个java用客户端和服务器程序实现C/S模式下的通信,还要实现多线程的聊天室代码...

    展开全部客户端:import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.eve...

  • 【精品毕设】基于JAVA网络通信系统的研究与开发(包含论文+源码)

    JAVA网络通信系统的研究与开发摘要:网络通信在当今信息社会中起着不可或缺的作用 ,人们可以利用网络通信技术进行即时的信息交流。例如,人们可以通过Internet搜索所要的信息,通过网上通信工具聊天,交流信息,上网购物等等。本课题是应用了计算机网络通信技术和JAVA网络编程的基础知识,以JAVA为平台,利用Eclipse开发工具,并使用SQL Server 2000管理数据库数据开发出的基于Socket的网络即时通信系统。

  • JAVA基础

    把具体对象列举出来1.构造器私有化2.去掉set方法3.创建固定的对象class jj{public static jj j1=new jj("春天");

  • 计算机网络 TCP/UDP程序开发网络聊天室

    开发TCP/UDP协议应用程序,掌握网络应用程序的工作原理。通过该实验,深入理解UDP和TCP协议的异同点,了解网络协议的工作过程,学会网络通信编程的基本方法,能够编制网络应用程序。

  • 使用JAVA编写网络通信程序

    摘要 本文阐述了使用JAVA编程语言对基于客户/服务器模式的应用编写网络通信程序,讨论了SOCKET机制、输入输出流以及程序实现代码。 关键词 JAVA,网络,SOCKET,APPLET 网络上的系统结构多为客户/服务器模式,服务器端负责数据和图像等的存储、维护、管理以及传递,客户端则负责人机界面的操作、送出需求及显示收回的数据。 下面介绍一下如何使用JAVA来进行网络编程: 1) 由于客户端通过

  • java通信类

    java对于网络通信有专门的包来管理,在自制服务器中,我们可以用ServerSokect来建立服务器,用Socket来作为客户端连接服务器,通信当然要有传输数据,对于传输流,Socket专门有一个InputStream和OutputStream作为客户端和服务器之间传输的通道,在客户端用Socket的getOutputStream().write()来写入数据,在服务器端用Socket的getIn...

  • 基于JAVA的博网即时通讯软件的设计与实现(附:源码 论文 Sql文件)

    即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,swing技术等进行实际开发相对比较合适。通过一些轻松的注册登录后,在局域网中即时聊天便可以成功进行。......

  • Java基础-网络通信

    1024~49151,分配给用户进程或某些应用程序(如 Tomcat 8080, MySQL 3306),我们自己开发的程序选择注册端口,且一个设备中不能出现两个一样端口号的程序,否则出错。收到发送方ip:/192.168.1.7:63581,端口:63581,发来消息:hello。收到发送方ip:/192.168.1.7:63581,端口:63581,发来消息:exit1。/192.168.1.7:55243发送:Tcp连接成功,你好,今晚约吗?发送端ip:/192.168.1.7:63536。

  • java远程通讯技术及简单实现

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java底层领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、SOAP、EJB和JMS 等,在j2ee中,对java底层远程通讯的技术进行了封装,形成了 Hessian 、 HttpInvoker 、 XFire 、 Axis 等多种形式的远程调用技术。 但对高级程序员而言仍需要掌握Java底层领...

  • java基础网络通信

    java网络通信基础

  • java网络通信

    java已经将网络程序所需要的东西封装成不同的类,只要创建这些类的对象,使用相应的方法,就可以实现网络通信。 服务器-----------网络-----------客户机。服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,通常所说的“局域网”(local Area Network)LAN ,是一群通过一定形式连接起来的计算机,LAN延伸到更大的范围,这样的网络称为“广局网”(w...

  • Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以。。。呵呵。。你懂得,昨天又仔细的学习了一遍,感觉其实java网络编程也没想象的那么难,不信,咱一起看看。。。呵呵。。 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所...

  • 12306火车订票系统(C++)

    12306火车订票系统(C++) 注意事项: 设计思路—设计问题解决思路、系统功能规划: 具体实现---类设计、功能实现过程: 实现代码: 需要的文件: 2018212591马俊光的用户信息.txt 2018212591马俊光的车次信息.txt 2018212591马俊光的购票记录.txt result与运行调试: 设计体会与小结:

  • Java网络通信

    计算机网络实现了多个计算机互连系统,相互连接的计算机之间彼此能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序相互之间可以交换数据。而编写网络应用程序,首先必须明确网络应用程序所要使用的网络协议,TCP/IP协议是网络应用程序的首选。 1.网络协议   网络协议规定了计算机之间连接的物理、机械(网线与网卡的连接规定)、电器(有效的电平范围)等特征以及计算机之间的相

  • 在eclipse上编写好一个Java程序后,怎么自动的导入程序需要的包?

    Ctrl+Shift+O

  • Java网络编程入门指南:实现一个多人聊天室

    Socket是Java网络编程的基本组成部分,它允许应用程序通过网络发送和接收数据。这个简单的聊天室示例允许多个客户端通过输入消息与服务器进行通信,服务器会将接收到的消息广播给所有连接的客户端。客户端和服务器之间的通信是基于Socket实现的。创建一个基本的Java服务器,以便接受来自客户端的连接请求和数据传输。创建一个基本的Java客户端,以便连接到服务器并进行数据传输。创建一个基本的RMI客户端,以便调用远程服务器上的方法。创建一个基本的RMI服务,以便远程调用服务器上的方法。

  • 【网络编程】C++实现网络通信服务器程序||计算机网络课设||Linux系统编程||TCP协议(附源码)

    在ServerTcp函数定义定义了一个init函数,用于配置服务器的网络监听套接字,绑定IP地址和端口,并开始监听来自客户端的连接请求。①首先创建套接字:使用 函数创建一个套接字,这里使用的是IPv4()和TCP()协议。如果创建失败,会记录错误信息并退出程序。②绑定地址和端口:创建一个 结构体变量 ,它用于保存服务器的本地地址信息。

Global site tag (gtag.js) - Google Analytics