2009-12-7 22:19:36 LinkTalk.NET(909327571)
暗夜教父, 你说的6万连接,每个连接每秒发1K包吗?
2009-12-7 22:19:49 暗夜教父(199033)
en
2009-12-7 22:19:49 jack(357794482)
就是后面函数执行完成之后的结果给前面的原子吗
2009-12-7 22:20:54 LinkTalk.NET(909327571)
机器配置如何?还有6万个客户端如何模拟的?
2009-12-7 22:21:41 暗夜教父(199033)
机器是AMD 双核 3200+
2009-12-7 22:21:50 LinkTalk.NET(909327571)
另外就是每个连接上的时间间隔为1秒,没有延迟吗?
2009-12-7 22:22:12 暗夜教父(199033)
内存是4G,操作系统ubuntu 9.10
2009-12-7 22:22:53 暗夜教父(199033)
我人为的没做这种延迟
2009-12-7 22:23:04 暗夜教父(199033)
服务器和客户端都是这个配置
2009-12-7 22:23:16 暗夜教父(199033)
客户端是用erlang模拟并发
2009-12-7 22:23:39 暗夜教父(199033)
不过创建6W个连接花费了一定的时间
2009-12-7 22:24:09 暗夜教父(199033)
对哦,这样就不是6万个一起并发出来的
2009-12-7 22:24:09 LinkTalk.NET(909327571)
大概多久?
2009-12-7 22:24:19 暗夜教父(199033)
没统计时间
2009-12-7 22:24:42 暗夜教父(199033)
这里存在问题了
2009-12-7 22:25:27 暗夜教父(199033)
其实并发应该是 连接数 / 创建并发的时间
2009-12-7 22:25:27 LinkTalk.NET(909327571)
什么问题?
2009-12-7 22:25:49 LinkTalk.NET(909327571)
这个无所谓
2009-12-7 22:26:08 LinkTalk.NET(909327571)
只要你全部连接创建好后一直保持住就可以了
2009-12-7 22:26:23 暗夜教父(199033)
一直保持也不是6万同时
2009-12-7 22:26:32 暗夜教父(199033)
创建连接有时差
2009-12-7 22:26:35 LinkTalk.NET(909327571)
6万个如果能够1k/s的保持48小时的话,非常牛逼了
2009-12-7 22:26:38 暗夜教父(199033)
那么发生数据也有时差
2009-12-7 22:27:53 LinkTalk.NET(909327571)
你通过什么方式做到间隔一秒发一次数据的?
2009-12-7 22:28:32 LinkTalk.NET(909327571)
sleep吗?
2009-12-7 22:29:19 LinkTalk.NET(909327571)
你有没有看一下网卡的带宽消耗
2009-12-7 22:29:37 LinkTalk.NET(909327571)
按道理应该1k * 6万 = 60M/s
2009-12-7 22:30:12 LinkTalk.NET(909327571)
如果达到60M以上基本算是真正的稳定的实现了6万并发
2009-12-7 22:30:34 暗夜教父(199033)
client那边是我同事写的
2009-12-7 22:30:39 暗夜教父(199033)
我不知道是不是sleep
2009-12-7 22:30:52 暗夜教父(199033)
带宽消耗我还也真没看
2009-12-7 22:30:53 LinkTalk.NET(909327571)
erlang里面好像也就只有sleep了
2009-12-7 22:31:06 暗夜教父(199033)
我估计不是
2009-12-7 22:31:52 LinkTalk.NET(909327571)
另外我怀疑当并发高了以后,sleep会不准,真正的间隔肯定会大于sleep的时间
2009-12-7 22:32:50 暗夜教父(199033)
恩,确实有待验证
2009-12-7 22:33:04 暗夜教父(199033)
不过只有用应用来验证了
2009-12-7 22:33:14 暗夜教父(199033)
等项目上线了,看看实际情况
2009-12-7 22:33:17 LinkTalk.NET(909327571)
嗯,呵呵
2009-12-7 22:33:24 LinkTalk.NET(909327571)
你们这个用在什么项目上马?
2009-12-7 22:33:27 LinkTalk.NET(909327571)
上面
2009-12-7 22:33:30 LinkTalk.NET(909327571)
游戏吗?
2009-12-7 22:33:31 暗夜教父(199033)
恩,游戏的
2009-12-7 22:34:48 LinkTalk.NET(909327571)
[表情]
2009-12-7 22:34:59 暗夜教父(199033)
不过风险也很大
2009-12-7 22:35:15 LinkTalk.NET(909327571)
为什么?
2009-12-7 22:35:24 暗夜教父(199033)
没做过
2009-12-7 22:35:28 暗夜教父(199033)
没有成熟项目的经验
2009-12-7 22:35:29 LinkTalk.NET(909327571)
呵呵
2009-12-7 22:35:32 暗夜教父(199033)
什么都有可能发生
2009-12-7 22:35:45 LinkTalk.NET(909327571)
传统的游戏服务器,单台到两三万并发已经很牛X了
2009-12-7 22:35:50 暗夜教父(199033)
未知因素太多
2009-12-7 22:36:00 暗夜教父(199033)
我估计6W还能上
2009-12-7 22:36:00 LinkTalk.NET(909327571)
而且硬件还不差的情况下
2009-12-7 22:36:11 LinkTalk.NET(909327571)
游戏的数据通信量比较大
2009-12-7 22:36:22 LinkTalk.NET(909327571)
嗯
2009-12-7 22:36:30 暗夜教父(199033)
没过6W是因为客户端的端口基本上没了
2009-12-7 22:36:45 LinkTalk.NET(909327571)
这个不会啊
2009-12-7 22:36:51 LinkTalk.NET(909327571)
客户端端口没有关系的
2009-12-7 22:36:55 暗夜教父(199033)
有吧
2009-12-7 22:36:59 LinkTalk.NET(909327571)
因为IP不一样
2009-12-7 22:37:11 暗夜教父(199033)
不是。我测试的时候
2009-12-7 22:37:15 LinkTalk.NET(909327571)
同一个IP有65535个端口的限制
2009-12-7 22:37:18 暗夜教父(199033)
6万个连接从一台机器来的
2009-12-7 22:37:18 LinkTalk.NET(909327571)
哦,了解
2009-12-7 22:37:23 LinkTalk.NET(909327571)
嗯
2009-12-7 22:37:54 david(258667581)
服务器端只监听一个端口 应该不会有端口数限制吧?
2009-12-7 22:38:24 LinkTalk.NET(909327571)
服务器端不会
2009-12-7 22:38:50 david(258667581)
做游戏的话 不是都雍和宫服务器吗
2009-12-7 22:38:55 david(258667581)
都做的服务器吗
2009-12-7 22:39:24 暗夜教父(199033)
。。。
2009-12-7 22:39:32 暗夜教父(199033)
我是做测试
2009-12-7 22:39:36 david(258667581)
另外 如果端口socket属性设置reuse为true 是否可以超过6W端口
2009-12-7 22:39:48 LinkTalk.NET(909327571)
不会
2009-12-7 22:39:53 暗夜教父(199033)
服务器端是一台机器,客户端也是一台机器
2009-12-7 22:39:56 LinkTalk.NET(909327571)
那个是针对不同的protocol
2009-12-7 22:40:02 暗夜教父(199033)
客户端发起6W个连接
2009-12-7 22:40:19 暗夜教父(199033)
就要占用6W多个端口
2009-12-7 22:40:18 david(258667581)
不同的protocol是什么意思
2009-12-7 22:40:35 LinkTalk.NET(909327571)
tcp 和 udp 可以reuse同一个port
2009-12-7 22:41:09 LinkTalk.NET(909327571)
erlang其实我只是大概的了解
2009-12-7 22:41:22 LinkTalk.NET(909327571)
我打算用C#和Java模拟erlang
2009-12-7 22:41:26 david(258667581)
程序a试用端口2000 tcp连 然后 程序b用2000端口udp再连接另外一个程序?
2009-12-7 22:41:36 david(258667581)
模拟?
2009-12-7 22:41:40 LinkTalk.NET(909327571)
嗯
2009-12-7 22:41:47 LinkTalk.NET(909327571)
我已经用C#实现了
2009-12-7 22:41:47 david(258667581)
怎么模拟?
2009-12-7 22:41:59 LinkTalk.NET(909327571)
就是Actor模式
2009-12-7 22:42:07 LinkTalk.NET(909327571)
自己实现消息的调度
2009-12-7 22:42:15 LinkTalk.NET(909327571)
还有实现异步编程接口
2009-12-7 22:42:41 david(258667581)
actor模式是什么意思
2009-12-7 22:42:59 LinkTalk.NET(909327571)
一种软件设计模式
2009-12-7 22:43:16 LinkTalk.NET(909327571)
erlang/scala等并发平台都是actor模式
2009-12-7 22:44:06 david(258667581)
不懂
2009-12-7 22:44:25 david(258667581)
为什么要用c#模拟?
2009-12-7 22:44:33 LinkTalk.NET(909327571)
因为我熟悉C#
2009-12-7 22:44:39 LinkTalk.NET(909327571)
也打算用java模拟
2009-12-7 22:45:01 LinkTalk.NET(909327571)
同时也因为C#/Java有大量的开发人员和丰富的第三方扩展
2009-12-7 22:45:25 LinkTalk.NET(909327571)
同时也有很爽的IDE
2009-12-7 22:45:26 LinkTalk.NET(909327571)
:)
2009-12-7 22:45:42 david(258667581)
是 但是感觉如果你是要测性能的话 c#的性能可能跟不上erlang啊
2009-12-7 22:45:49 david(258667581)
用c的都会好些
2009-12-7 22:46:01 LinkTalk.NET(909327571)
其实erlang语言本身性能不见得高,因为是脚本语言
2009-12-7 22:46:15 LinkTalk.NET(909327571)
高并发是因为纯消息传递,可以有效的避免死锁
2009-12-7 22:46:27 LinkTalk.NET(909327571)
传统语言比如c/c++要避免死锁比较难
2009-12-7 22:46:49 LinkTalk.NET(909327571)
给大家看老外的一个测试数据
2009-12-7 22:46:57 LinkTalk.NET(909327571)
erlang其实算是执行效率相对比较差的
2009-12-7 22:47:20 david(258667581)
哪里 erlang的性能应该是可以跟c叫板的
2009-12-7 22:48:04 LinkTalk.NET(909327571)
http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=csharp&lang2=hipe&box=1
2009-12-7 22:48:16 LinkTalk.NET(909327571)
这个里面有很多语言的性能测试比较
2009-12-7 22:48:23 LinkTalk.NET(909327571)
erlang算是比较差的
2009-12-7 22:49:02 LinkTalk.NET(909327571)
传统语言达不到高并发是因为无法有效的避免死锁,还有cpu调度做得不好
2009-12-7 22:50:17 暗夜教父(199033)
恩,C如果使用erlang的模式
2009-12-7 22:50:26 暗夜教父(199033)
绝对不会输
2009-12-7 22:50:29 LinkTalk.NET(909327571)
嗯
2009-12-7 22:50:37 LinkTalk.NET(909327571)
erlang本身就是C写的
2009-12-7 22:50:41 暗夜教父(199033)
恩
2009-12-7 22:50:54 LinkTalk.NET(909327571)
我记得国内好像有个牛人在研究用C++模拟erlang
2009-12-7 22:51:00 LinkTalk.NET(909327571)
好像是盛大的一个架构师
2009-12-7 22:51:13 暗夜教父(199033)
貌似现在做linux下做服务器端得,C比C++多了
2009-12-7 22:51:20 LinkTalk.NET(909327571)
嗯
2009-12-7 22:51:29 LinkTalk.NET(909327571)
linux下c多
2009-12-7 22:51:36 暗夜教父(199033)
我记得好像云风把大话西游的服务器端改成C了
2009-12-7 22:52:28 小生啊牙(86753957)
51.com的服务器就是用C++模拟erlang的
2009-12-7 22:52:50 小生啊牙(86753957)
使用协程
2009-12-7 22:53:59 LinkTalk.NET(909327571)
嗯,协程可以在传统的面向过程的线程上模拟异步操作
2009-12-7 22:55:05 LinkTalk.NET(909327571)
其实高并发只是一种设计模式
2009-12-7 22:55:19 LinkTalk.NET(909327571)
erlang把这个设计模式固化并强制到语法里了
2009-12-7 22:56:22 LinkTalk.NET(909327571)
C#2.0开始有个新的特性,叫iterator,通过yield关键字来实现coroutine(协程)
2009-12-7 22:56:39 LinkTalk.NET(909327571)
并且在语法上也可以用连贯的形式来实现异步的操作
2009-12-7 22:56:49 LinkTalk.NET(909327571)
和erlang的形式类似
2009-12-7 22:57:10 LinkTalk.NET(909327571)
java里面目前只有anonymous class可以实现异步调用
2009-12-7 22:57:44 LinkTalk.NET(909327571)
但是那个语法写起来有些牵强,花括号会越嵌越深
2009-12-7 22:59:19 LinkTalk.NET(909327571)
我用C#实现的actor模式也可以处理每分钟大概200万条消息(在PC上)
2009-12-7 22:59:24 LinkTalk.NET(909327571)
AMD双核
2009-12-7 23:00:28 LinkTalk.NET(909327571)
也测试过HTTP 请求,大概可以达到1万多并发,不过是6秒一个请求(sleep6秒,实际会延迟到10秒以上),cpu占用40-60
2009-12-7 23:01:54 LinkTalk.NET(909327571)
每分钟200万消息是最简单的ping/pong测试
2009-12-7 23:06:12 david(258667581)
以前没听说过 协程 呵呵
2009-12-7 23:06:33 LinkTalk.NET(909327571)
是否有协程无所谓的
2009-12-7 23:07:14 LinkTalk.NET(909327571)
关键是纯消息传递(避免死锁)还有线程合理有效的调度(实现高效的异步处理)
2009-12-7 23:07:35 david(258667581)
恩 关键是避开锁
2009-12-7 23:08:04 LinkTalk.NET(909327571)
并最好再能够在语法上将异步操作用顺序化的代码来表示
2009-12-7 23:08:22 LinkTalk.NET(909327571)
实在不行也无所谓,可以用event handler的方式
2009-12-7 23:08:48 david(258667581)
能否举一个异步操作的具体应用场景?
2009-12-7 23:09:08 LinkTalk.NET(909327571)
很多都是异步操作(那样IO才可以做到高效)
2009-12-7 23:09:19 LinkTalk.NET(909327571)
比如epoll和windows的iocp
2009-12-7 23:09:22 LinkTalk.NET(909327571)
都是异步的
2009-12-7 23:09:44 LinkTalk.NET(909327571)
简单的原理就是调用函数递交或注册一个IO请求到系统内核
2009-12-7 23:09:45 david(258667581)
是不是都是底层的
2009-12-7 23:09:55 LinkTalk.NET(909327571)
然后不需要阻塞,立即返回
2009-12-7 23:10:17 LinkTalk.NET(909327571)
系统IO内核收到数据或相关的事件会触发当初注册的回调函数
2009-12-7 23:10:59 LinkTalk.NET(909327571)
调用请求 和 数据返回或事件触发 不在同一个操作系统线程上完成,就称为异步
2009-12-7 23:11:13 LinkTalk.NET(909327571)
异步的IO才比较高效
2009-12-7 23:11:37 LinkTalk.NET(909327571)
操作系统的线程数有限制
2009-12-7 23:11:42 david(258667581)
这些都不难 无论是java和c#还是c,都已经有专门的api支撑了
2009-12-7 23:11:51 david(258667581)
关键是业务上的操作
2009-12-7 23:11:55 LinkTalk.NET(909327571)
一般上了千以后,线程的效率就比较差了
2009-12-7 23:11:58 david(258667581)
锁的都是业务
2009-12-7 23:12:02 LinkTalk.NET(909327571)
而且很耗cpu和内存
2009-12-7 23:12:23 LinkTalk.NET(909327571)
所以要通过合理的调度和异步操作来分享宝贵的操作系统线程
2009-12-7 23:12:51 LinkTalk.NET(909327571)
严格遵守actor模式可以有效的避免死锁
2009-12-7 23:13:04 david(258667581)
[表情]
2009-12-7 23:14:34 LinkTalk.NET(909327571)
我也在摸索和尝试,erlang的消息调度和分布式支持是目前最好的
2009-12-7 23:14:49 LinkTalk.NET(909327571)
scala也不错,twitter就放弃erlang转向scala
2009-12-7 23:15:00 LinkTalk.NET(909327571)
但是scala在分布式支持方面不及erlang
2009-12-7 23:15:30 LinkTalk.NET(909327571)
但是scala有最大的好处就是基于JVM,可以利用java的各种好处
2009-12-7 23:15:33 david(258667581)
分布式以后是趋势 所以感觉erlang的生命力应该还是很强的
2009-12-7 23:15:44 LinkTalk.NET(909327571)
嗯,分布式其实其他语言也可以做的
2009-12-7 23:16:05 LinkTalk.NET(909327571)
只是erlang已经做了十几年了
2009-12-7 23:16:19 LinkTalk.NET(909327571)
其他语言也肯定会逐渐支持的
2009-12-7 23:16:25 david(258667581)
恩
2009-12-7 23:16:43 LinkTalk.NET(909327571)
但是我个人比较觉得遗憾的是erlang的语法和编程模式
2009-12-7 23:17:08 LinkTalk.NET(909327571)
如果erlang代码上到一定的量以后维护和调试就相当麻烦了
2009-12-7 23:17:11 david(258667581)
语法习惯了就好 关键是对于结构的支持
2009-12-7 23:17:17 david(258667581)
可读性太差
2009-12-7 23:17:31 LinkTalk.NET(909327571)
嗯,数据结构表现力也不够丰富
2009-12-7 23:17:35 LinkTalk.NET(909327571)
都是tuple
2009-12-7 23:17:43 LinkTalk.NET(909327571)
眼睛要看花了
2009-12-7 23:19:09 david(258667581)
开发环境也没跟上 没有很好的IDE
2009-12-7 23:19:16 LinkTalk.NET(909327571)
嗯
2009-12-7 23:19:37 LinkTalk.NET(909327571)
脚本语言重构起来就相当麻烦了
2009-12-7 23:19:57 T.t.T!Ck.¢#(121787333)
有一个老外也用C#来模拟erlang的模式
2009-12-7 23:20:06 LinkTalk.NET(909327571)
因为无类型,无法反射元数据,没有办法自动生成文档,更难重构
2009-12-7 23:20:07 Lenn(28663)
ERLANG跟Java一样是编译态语言,怎么成脚本语言了
2009-12-7 23:20:22 LinkTalk.NET(909327571)
erlang严格来讲是脚本
2009-12-7 23:20:31 LinkTalk.NET(909327571)
弱类型的基本都是脚本
2009-12-7 23:20:44 LinkTalk.NET(909327571)
包括php也号称支持编译
2009-12-7 23:20:47 LinkTalk.NET(909327571)
其实还是脚本
2009-12-7 23:21:16 Lenn(28663)
bin code只有200多条指令,属于典型的中间太语言,效率不会比Java差多少
2009-12-7 23:21:34 LinkTalk.NET(909327571)
嗯
2009-12-7 23:21:48 LinkTalk.NET(909327571)
我觉得任何东西都有得必有失
2009-12-7 23:21:57 LinkTalk.NET(909327571)
一方面太强了,比如有其他的缺陷
2009-12-7 23:22:06 LinkTalk.NET(909327571)
就看自己的喜好和具体的应用场景了
2009-12-7 23:22:08 Lenn(28663)
图形太弱
2009-12-7 23:22:47 Lenn(28663)
调试起来最爽,业务想对了基本不会编程从出错
2009-12-7 23:23:16 LinkTalk.NET(909327571)
嗯
2009-12-7 23:24:26 Lenn(28663)
我们就是一个案例,用JAVA做的东西,现在还不停改代码,Erlang那一块,要改也只是几行一会的事情
2009-12-7 23:25:17 jack(357794482)
其实这种事情要看你对语言的处理能力
2009-12-7 23:25:20 LinkTalk.NET(909327571)
嗯
2009-12-7 23:25:35 LinkTalk.NET(909327571)
google的首席架构师是搞java的
2009-12-7 23:25:41 LinkTalk.NET(909327571)
其实这个看具体情况的
2009-12-7 23:26:17 Lenn(28663)
用什么还有历史原因,比如新的facebook很多用Erlang
2009-12-7 23:26:33 Lenn(28663)
因为做好的东西更改语言是个大问题
2009-12-7 23:26:36 LinkTalk.NET(909327571)
但是更新的twitter由erlang转向了scala
2009-12-7 23:26:58 LinkTalk.NET(909327571)
另外erlang十几年了,到今天才红,也是有一定的原因的
2009-12-7 23:27:13 LinkTalk.NET(909327571)
erlang有非常突出的优势,但是也存在一些不够完美的地方
2009-12-7 23:29:04 Lenn(28663)
现在社区也挺活跃,业务有比较强的优势
2009-12-7 23:29:37 LinkTalk.NET(909327571)
嗯,是的;)
2009-12-7 23:29:57 LinkTalk.NET(909327571)
所以就算其他语言的开发人员也开始了解
2009-12-7 23:30:02 LinkTalk.NET(909327571)
学习、
2009-12-7 23:30:04 Lenn(28663)
图形方面却丝毫不行
2009-12-7 23:30:05 LinkTalk.NET(909327571)
或模拟erlang
2009-12-7 23:30:08 LinkTalk.NET(909327571)
嗯
posted on 2009-12-07 23:49
暗夜教父 阅读(731)
评论(0) 编辑 收藏 引用 所属分类:
erlang