簡體   English   中英

異步線程tcp服務器

[英]Async threaded tcp server

我想用C#創建一個高性能服務器,可能需要大約10萬個客戶端。 現在我開始用C#編寫TcpServer,並為每個客戶端連接打開一個新線程。 我還使用一個線程來接受連接。 到目前為止這么好,工作正常。

服務器必須反序列化AMF傳入對象做一些邏輯(比如保存播放器的位置)並發回一些對象(序列化對象)。 我並不擔心序列化/反序列化部分atm。

我主要擔心的是,我將擁有10k個客戶端的大量線程,而且我已經讀過某個操作系統只能保持幾個hunderd線程的地方。

有沒有關於編寫體面的異步線程服務器的資料/文章? 還有其他可能性還是10k線程可以正常工作? 我看過谷歌,但我找不到很多關於設計模式或清楚解釋的方法的信息

你會遇到很多問題。

  1. 出於幾個原因,您無法啟動10,000個線程。 它會破壞內核調度程序。 如果您運行的是32位,則默認堆棧地址空間為1MB意味着10k線程將保留大約10GB的地址空間。 那會失敗。

  2. 您也不能使用簡單的選擇系統。 在它的核心,選擇是O(N)的插座數量。 有10k插座,這很糟糕。

  3. 您可以使用IO完成端口。 這是他們設計的場景。 據我所知,沒有穩定的托管IO完成端口庫。 您必須使用P / Invoke或Managed C ++編寫自己的代碼。 玩得開心。

編寫高效多線程服務器的方法是使用I / O完成端口(每個請求使用一個線程是非常低效的,如@Marcelo所提到的)。

如果您使用.NET套接字類的異步版本,則可以免費獲得。 請參閱此問題 ,其中包含指向文檔的內容。

你絕對不希望每個請求都有一個帖子。 即使您擁有較少的客戶端,創建和銷毀線程的開銷也會削弱服務器,並且您無法獲得10,000個線程; 操作系統調度程序很久就會死於可怕的死亡。

網上有很多關於C#中異步服務器編程的文章(例如, 這里 )。 只是google一下。

您想要研究使用IO完成端口 您基本上有一個線程池和一個IO操作隊列。

I / O完成端口提供了一種有效的線程模型,用於處理多處理器系統上的多個異步I / O請求。 當進程創建I / O完成端口時,系統會為請求創建關聯的隊列對象,這些請求的唯一目的是為這些請求提供服務。 處理許多並發異步I / O請求的進程可以通過將I / O完成端口與預分配的線程池結合使用,而不是在接收I / O請求時創建線程,從而更快速有效地執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM