阅读更多

8顶
0踩

非技术

原创新闻 Joel Reymont对Erlang的抱怨

2008-09-13 09:09 by 见习记者 cryolite 评论(8) 有12693人浏览
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 入门(完整教程)

    1991 年,美国的 Sun 公司为了开发智能家电等嵌入式设备的控制系统,由詹姆斯・高斯林(James Gosling)领导的 Green 计划 团队开始了一种新语言的研发。最初该语言被命名为 Oak(橡树),它是基于 C++ 开发的,吸收了 C++ 的优点并做出来扩展,同时摒弃了 C++ 中的一些复杂概念,使得 Java 功能强大的同时又易于理解和使用。

  • 基于消息方式实现系统间通信

    大型应用通常会拆分为多个子系统来实现,但这些子系统又不是完全独立的,要相互通信来共同实现业务功能,对于此类Java应用,我们称之为分布式Java应用。本篇幅介绍说明基于消息方式实现系统间通信。 当系统之间要通信时,就向外发送消息,消息可以是字节流、字节数组,甚至是Java对象...

  • java通信类

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

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

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

  • Java网络通信理解

    - 实现网络功能要靠URL类,URLConectioon类、Socket类和DatagramSocket类 - 网络上的数据传送是将网络连接转换成输入输出流 - DataInputStream和DataOutputStream是网络间流的载体

  • 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面向对象-网络编程(通信)

  • 三、Java网络通信_16(笔记)

    Java网络通信

  • JAVA基础篇——网络通信

    JAVA基础、网络通信、CS、BS、UDP、TCP

  • Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2.2 UDP发送数据 2.3 UDP接收数据

  • 【详细】Java网络通信 TCP、UDP、InetAddress

    为了实现两台计算机的通信,必须用一个网络线路连接两台计算机(服务器网络客户机)。是指的计算机或程序,是指的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。但有时在某个网络中很难将服务器与客户机区分开。我们通常所说的)就是一群通过一定形式连接起来的计算机。它可以由两台计算机组成,也可以由同一区域内的上午台计算机组成。将LAN延伸到更大的范围,这样的网络称为我们熟悉的因特网(Internet)就是由无数的LAN和WAN组成的。

  • 详解Java实现网络通信(TCP、UDP通信)——实现群聊功能

    系统全面地学习网络通信三要素(IP地址Inetaddress类、端口、协议),TCP和UDP通信,包括客户端和服务端开发,多发多收,实现群聊,通俗易懂,一学就会

  • java socket外网连接_Java利用Socket进行远程过程调用

    需求概述服务器上有一个getData()方法,客户端想调用服务器的getData()方法,此时必须通过RPC来进行调用了。WebService太冗余,为了提高性能,决定直接用socket进行实现。实现代码(Socket通讯模板代码)BusinessServer.javapackage com.mrbcy.bigdata.basic.socket;import java.io.IOException...

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

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

  • java网络通信_Java网络通信

    协议和SocketTCP/IP协议是一个协议簇,里面包括很多协议的。TCP/UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。IP 协议对应于网络层,TCP协议对应于传输层,HTTP协议对应于应用层,三者从本质上来说没有可比性可以说,TPC/IP协议是传输层协议,主要...

  • Java网络编程及通信

    Java网络编程以及通信

  • TCP通讯程序的编写

    TCP通讯程序的编写

Global site tag (gtag.js) - Google Analytics