INDY TIDTCPSERVER 對於多 CLIENT 連線配置的問題 |
尚未結案
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
小弟想請教一個對於多 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
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
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 發送簡訊給我 |
非常感謝 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
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
感謝 sryang 前輩不厭其煩的指導, 事實上 CLIENT 分組的事, 已是現況 , 客戶端有約 500 個 CLIENT , 分屬不同樓層, 當中分為四組不同網段, 每個網段連到不同主機 (所以有四台主機), 四台主機上所執行的程式跟提供的服務功能完全一樣, 只是有 CONFIG 可設定各主機自己的 ID
這樣只是讓四台主機分擔 500 台 CLIENT 的連線, 不過CLIENT 要怎麼分組規劃切網段? 怎麼分組規劃切 PORT? 或是利用 broker 去分派連向的主機服務, 這是另外的課題, 小弟只是想確認上面所述 : 透過可以增加連線效能的話, 接下來就可以自由發揮了 .... 例如, 我不需要靠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
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
增加一個 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 發送簡訊給我 |
以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 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
在主程式基礎上,如果沒有辦法做到在分別考慮(分網卡 or分 Port ) 要件。
分 4 Process 不是很好的方法,應該說這樣不會有太大的意義。 Milti-Thread 一定要有的,但是不可能不限制 Thread 數量。 我的做法是 Main -Thread 一開始建立 群 Thread(Thread數量自己調整),在依照 Client 要求分別分配 服務 Thread 及 排隊。 400 Client 很快的就被分散消化掉。 建議按照方案的特性,使用合適的方式。 如果網路封包不大(或者僅在區域網路),分網路卡不是多此一舉。除非都在檔案下載。 如果您要榨乾主機資源,那代表主機是在非常危險的狀態。 淺見參考 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |