線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2574
推到 Plurk!
推到 Facebook!

INDY TIDTCPSERVER 對於多 CLIENT 連線配置的問題

尚未結案
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-07-08 09:52:14 IP:122.117.xxx.xxx 訂閱
小弟想請教一個對於多 CLIENT 連線配置的問題, 如果說有 400 台 CLIENT 要連入一台 SERVER 主機, 每台 CLIENT 對於 SERVER 所要求的服務內容相同( 無外乎就是資料交換之類的)
在只有一台 SERVER 主機的前提下,
除了以下傳統方式
(1) 在 SERVER 主機上用 INDY TIDTCPSERVER 元件寫一支 SERVER 程式( EXE 檔), 此程式中只有使用一個 TIDTCPSERVER 元件, 也就是一個 TIDTCPSERVER 元件的 OnExecute 要處理 400 個 CLIENT 的 REQUEST

我還想倒
(2) 一支 SERVER 程式( EXE 檔) , 放入四個 TIDTCPSERVER 元件, 分別綁到同一 IP 不同的 PORT (如 6501, 6502,6503,6504) , 而 400 個 CLIENT 也將它們分成四組, 每 100 台為一組, 各自連到 6501, 6502,6503,6504 四組 PORT, 也就是 一支 SERVER 程式( EXE 檔), 有四個 TIDTCPSERVER 元件, 每個 TIDTCPSERVER 元件的 OnExecute 只處理 100 個 CLIENT 的 REQUEST

(3) SERVER 主機上插四張網卡, RUN 一支 SERVER 程式( EXE 檔) , 程式內有四個 TIDTCPSERVER 元件, 分別綁到四個 IP, 而 400 個 CLIENT 也將它們分成四組四個網段, 每 100 台為一個網段連到一個主機網卡上

(4) 甚至我乾脆同時執行四個 EXE 檔 , 每個 EXE 檔中只有一個 INDY TIDTCPSERVER 元件 , 四個 EXE 檔透過各自參數設定綁定不同 IP 或 PORT, 可以分別處理四個 IP 或 四個 PORT 上各自的 100 個 REQUEST (我相信, 不管任何程式應用, 四支 "完全獨立" 的 EXE 檔處理四組工作, 應該比一支 EXE 檔中分四組執行緒處理四組工作有效率)


以上是我的想法, 對於只有一台 SERVER 主機的前提下 , 以上四種架構 "壓搾" 主機資源 (或說有效利用主機資源) 的結果應該是有所不同, 不知是否是 "根本沒差" , 或是 "脫褲子放X" , 還是小弟觀念有誤 ?? 謝謝有實做經驗或有 TCP/IP 學術背景的前輩給予指導





編輯記錄
digitraveler 重新編輯於 2010-07-08 09:55:50, 註解 無‧
digitraveler 重新編輯於 2010-07-08 09:58:57, 註解 無‧
digitraveler 重新編輯於 2010-07-08 10:00:56, 註解 無‧
digitraveler 重新編輯於 2010-07-08 10:12:30, 註解 無‧
digitraveler 重新編輯於 2010-07-08 10:13:17, 註解 無‧
digitraveler 重新編輯於 2010-07-08 10:20:01, 註解 無‧
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-07-08 13:22:13 IP:59.125.xxx.xxx 訂閱
Indy 的 TCPServer 本身有做 Multi-Thread,所以只要善用 Critical Section 把共用資源管控好
一台 Server 可以服務非常多 Client 的

至於能服務多少 Client,寫一個壓力測試程式,模擬很多 Client 下去測試就知道了

Critical Section 的用法很簡單

[code delphi]
uses syncobjs;

var
LockXY: TCriticalSection;

// 建立 Critical Section 物件,可以在程式一開始就建立
LockXY := TCriticalSection.Create;


// 使用 Critical Section
LockXY.Acquire; // 進入 Critical Section,用 Enter 也可以
try
// 這裡就是存取共用資源的地方,例如資料庫存取、寫 Log 檔等等
Y := sin(X);
finally
LockXY.Release; // 離開 Critical Section,用 Leave 也可以
end;


// 不用了,釋放掉,可以在程式結束時釋放
LockXY.Free;
[/code]
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2010-07-08 13:40:44, 註解 增加 Critical Section 的用法‧
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-07-08 15:07:58 IP:118.171.xxx.xxx 訂閱
非常感謝 sryang 前輩的指導, 事實上這就如同小弟第 (1) 點提到的做法 : 一個 EXE 檔中的一個 TidTCPServer 一次服務 400 台 Client, 而怎麼管理好 400 個 Client 同時連線的問題, 就需要前輩所提到的技術 (事實上若不用到前輩所提或類似的技術, 別說 400 個了, 2 個 CLIENT 同時連上來就可能造成資料 LOSS 了)


但小弟題意比較偏 "如何壓榨主機效能或是讓連線更順暢", 據小弟道聽塗說到一般 AP (如一個 EXE 檔) 再厲害也頂多只能使用到硬體 30% 的效能, 最近流行一種叫做主機虛擬化的技術, 可以在一個硬體上跑三個 O.S., 可以壓榨更高的硬體資源, 同理可證(雖然可能是小弟錯誤的觀念), 一個 EXE (INSTANCE)一次服務 400 個 CLIENT, 應該跟用 四個 EXE (INSTANCE) 服務 400 個 CLIENT 效能不一樣

(1) 雖然小弟知道一個 EXE 檔(INSTANCE) 中只放一個 TidTCPServer , 一次服務 400 台 Client 是沒問題的
(2) 但小弟認為想辦法拆成四個 EXE 檔(INSTANCE), 或是一個 EXE 檔(INSTANCE) 中放四個 TidTCPServer , 每個 TidTCPServer 分別只服務 100 個 CLIENT , "應該(可能)" 會更 SMOOTH, 就執行緒互相競爭或等待的機率來看, 一個 TidTCPServer 的 OnExecute 中, 1 個 client 要跟其它 99 個或 399 個 client 競爭或等待, 應該就有差別, 只是小弟不清楚的是, 不同 的 TidTCPServer 之間 , 甚至是跨不同的 EXE 檔之間, CLIENT 連線是否也有彼此競 爭或等待的問題, 小弟認為應該是不會; 也就是小弟認為在這個架構下, 共有四組人馬使用資源, 每組人馬有 100 個 CLIENT, 每一個 CLIENT 只要跟其他 99 個 CLIENT 產生競爭或等待的問題, 不會跟其它 300 個不同組別 (綁在同一機器上不同 IP 或不同 PORT) 的人馬產生競爭或等待的問題 , 小弟是想問 : 是否這種想法是大錯特錯, 或是有人有相關經驗, 謝謝
編輯記錄
digitraveler 重新編輯於 2010-07-08 15:13:22, 註解 無‧
digitraveler 重新編輯於 2010-07-08 15:24:17, 註解 無‧
digitraveler 重新編輯於 2010-07-08 15:59:42, 註解 無‧
digitraveler 重新編輯於 2010-07-08 16:07:18, 註解 無‧
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-07-08 15:21:55 IP:59.125.xxx.xxx 訂閱
TCPServer 會 Binding 你設定的 Port,一台機器上的 Port 同一時間只能有一個 Binding
以你的想法,用多支程式分別服務多個 Client,Port 就得分開
Port 分開不打緊,但是你要如何規劃你的 Client 們哪些連到 port A,哪些連到 port B 呢?

還是你要做一個 broker 去分派工作?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-07-08 15:58:00 IP:122.117.xxx.xxx 訂閱
感謝 sryang 前輩不厭其煩的指導, 事實上 CLIENT 分組的事, 已是現況 , 客戶端有約 500 個 CLIENT , 分屬不同樓層, 當中分為四組不同網段, 每個網段連到不同主機 (所以有四台主機), 四台主機上所執行的程式跟提供的服務功能完全一樣, 只是有 CONFIG 可設定各主機自己的 ID
這樣只是讓四台主機分擔 500 台 CLIENT 的連線, 不過CLIENT 要怎麼分組規劃切網段? 怎麼分組規劃切 PORT? 或是利用 broker 去分派連向的主機服務, 這是另外的課題, 小弟只是想確認上面所述 : 透過綁在不同 IP 或綁在不同 PORT 的多個 TCPServer 來分擔處理 CLIENT 連線, 這樣的確可以增加連線效能的話, 接下來就可以自由發揮了 ....


例如, 我不需要靠broker 去分派工作 (我目前也不知道 broker 程式要怎麼寫, 另外 broker 程式 是否又需多佔一台主機硬體 ... ) , 稍微修改一下現況環境, CLIENT 一樣為四個網段 , 但主機只留下一台, 並改插四張網卡 , 每張網卡背後被一個 TCPServer 元件所綁定, 所以有四個 TCPServer 元件 , 這四個 TCPServer 元件可能都是同在一個 EXE 檔程式內, 也可能分屬四個同時執行的 EXE 檔內
編輯記錄
digitraveler 重新編輯於 2010-07-08 16:05:15, 註解 無‧
digitraveler 重新編輯於 2010-07-08 16:11:47, 註解 無‧
digitraveler 重新編輯於 2010-07-08 16:14:58, 註解 無‧
digitraveler 重新編輯於 2010-07-08 16:17:20, 註解 無‧
digitraveler 重新編輯於 2010-07-08 16:20:50, 註解 無‧
digitraveler 重新編輯於 2010-07-08 17:11:26, 註解 無‧
digitraveler 重新編輯於 2010-07-08 17:12:54, 註解 無‧
bestlong
站務副站長


發表:125
回覆:734
積分:506
註冊:2002-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-07-14 14:57:53 IP:210.242.xxx.xxx 未訂閱
增加一個 broker 程式來告知 Client 改連哪一台 Server 比較恰當
而 Client 只是先連線到 broker 取得被分配到的 Server IP 然後斷線再去連接 Server 就可以了
所以 broker 只需要用很少的資源
broker 還可以與所有 Server 程式進行溝通看是否存在與個別連線負載
來決定該如何分配
這樣所有的 Client 的連線設定就統一且簡化了
再保險一點就用兩個 broker service 來備援
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
編輯記錄
bestlong 重新編輯於 2010-07-14 15:00:30, 註解 無‧
bruce_59714
一般會員


發表:3
回覆:19
積分:9
註冊:2006-07-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-12-28 20:09:43 IP:61.227.xxx.xxx 訂閱
以TCP Socket之觀念,TCP Server之(IP, Port Numer)對,必須為唯一,1台主機4網卡固然不會衝突(若只有1網卡執行4個TCP Server程式亦可行,但須Bind 4個不同之Port Number),此時你要時時注意你的 TCP Client程式要連的(IP, Port Numer)對以分散資源。
另外更重要的是你的TCP Server背後要提供之服務例如Database onnections or Data Set processing or whatever...之資源分配要考慮清楚,以免處理速度Cient 端會慢的難以接受,請記住:TCP 為Connection Oriented任何一次Connect應處理何時要DisConnect or Connection refuse之邏輯,以保TCP Server之穩健及資源共享!

以上淺見,請參考。


Bruce
RootKit
資深會員


發表:16
回覆:357
積分:419
註冊:2008-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-12-30 22:02:59 IP:122.126.xxx.xxx 訂閱
在主程式基礎上,如果沒有辦法做到在分別考慮(分網卡 or分 Port ) 要件。 

分 4 Process 不是很好的方法,應該說這樣不會有太大的意義。

Milti-Thread 一定要有的,但是不可能不限制 Thread 數量。
我的做法是 Main -Thread 一開始建立 群 Thread(Thread數量自己調整),在依照 Client 要求分別分配 服務 Thread 及 排隊。
400 Client 很快的就被分散消化掉。

建議按照方案的特性,使用合適的方式。
如果網路封包不大(或者僅在區域網路),分網路卡不是多此一舉。除非都在檔案下載。

如果您要榨乾主機資源,那代表主機是在非常危險的狀態。

淺見參考

系統時間:2017-10-20 4:13:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!