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
暗夜教父 閱讀(743)
評論(0) 編輯 收藏 引用 所屬分類:
erlang