阅读更多

8顶
0踩

非技术

原创新闻 Joel Reymont对Erlang的抱怨

2008-09-13 09:09 by 见习记者 cryolite 评论(8) 有12639人浏览
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编写网络通信程序

    Java中输入/输出流概念、Socket 机制、Java语言、JAVA工具、客户机/服务器通信的实现。

  • 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笔记——Java简介

    它不仅是JDK的一个非常重要的部分,也是JRE的一个非常重要的部分,因为它在这两个地方都是内置的。为了在 java 中进一步执行,我们需要在我们的计算机上安装 JDK,以进一步导致 java 程序的创建、编译和运行。Java 架构的设计方式是,它可以减少我们运行应用程序时的开销,并且在某些时候,它使用 JIT(Java In Time) 编译器,编译器可以轻松地按需编译代码基础知识,其中它只编译我们调用的方法,这使得应用程序执行得更快。因此,在执行源代码后,出现在所有操作系统上的输出将是相同的。

  • 计算机网络 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成神之路——网络编程

    一 、什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 1 网络编程的目的 实现传播交流信息,数据交换、通信 2 如何确定网络上的一台主机 IP地址 + port 定位到这台计算机的某个资源 eg:192.168.16.124:8080 二 、网络通信要素 1 、 通信双方地址 : IP + port 2 、 网络通信的协议 TCP/IP参考模型 我们

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

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

  • 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网络通信

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

  • Java实现网络通信(TCP程序设计)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、TCP网络程序设计是什么?二、TCP网络程序设计原理:1.图示:2.读入数据总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、TCP网络程序设计是什么? TCP网络程序设计是指利用Socket类编写通信程序。 利用TCP协议进行通信的程序有主次之分,一个称为服务器端程序,另一个称为客户端程序 二、TCP网络程序设计原理: 1.图示: 代码如下(示例): import numpy as np import panda

  • Java利用TCP协议实现客户端与服务器通信【附通信源码】

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的。 目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP、TCP、UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章“盘点那些进行网络编程必须要知道的基础知识”,那么今天大灰狼就来和大家分享一下如何使.

  • java实验 基于GUI的网络通信程序设计

    服务器端 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.ServerSocket; import java.net.Socket; pu...

  • Java网络编程实现

    前言 计算机网路实现了多个网络终端的互联,彼此之间能够进行数据交流。而网络应用程序就是在已连接的不同终端设备上运行的程序,这些网络程序相互之间可以进行数据交互。网络程序的数据交互则依赖于TCP/IP协议,在实际应用中TCP网络程序提供可靠的数据通信,而UDP网络程序则不保证数据的可靠性,但是协议简单、传输速度快(比如用在音视频数据传输,它们不需要很高的可靠性,偶尔丢帧是可以忍受的)。 Serv...

  • java实现ip聊天,基于Tcp/IP的JAVA简单聊天程序

    /*Copyright 2005*make by cat lee*基于TCP/IP的简单聊天程序*使用方法:先启动Server端.然后再启动Client端.*程序有很多错误,做得很马虎,本来想把发送文件加上去的.但又要做网络版坦克小战了*我在Java中做不出好像QQ那样的发送消息热键,本来打算用keylistener监听F8键来发消息的*但不知道为什么不行..郁闷.*至于界面,本来想用 IFram...

  • 利用Java实现网络通信

    利用Java实现网络通信吕昱  计算机通过TCP/UDP协议在网络上通信是建立在以下四层模型之上的:  当我们编写JAVA应用程序时,主要是在第四层即应用层工作。一般说来,不必关心TCP/UDP层,这是因为java.net包已提供了系统无关的底层实现。然而,理解TCP和UDP对于决定选择使用哪种java类,还是十分必要的。  TCP协议是以连接为基础的协议,通信前,首先要建立连接,

Global site tag (gtag.js) - Google Analytics