2014-11-22 67 views
2

您好我正在使用TCP在C語言的Linux上編寫服務器。 服務器必須處理多個連接(最多約5000個)。 5000是最大的,但平均值應該是500 - 1000. 我想知道什麼是最好用於處理客戶端連接和聆聽。如果最好爲每個客戶端使用一個線程或使用select()函數。在Linux服務器上處理多個客戶端連接的正確方法是什麼

1)線程 - 每個客戶端都有自己的線程。該線程正在偵聽客戶端的請求並對其進行處理。

選擇功能 - 一個循環與選擇,其中所有請求正在處理。 (類似於這個http://www.binarytides.com/multiple-socket-connections-fdset-select-linux/

如果我會使用線程,它將需要大量的內存和CPU性能。因此,我更喜歡使用select,但我不確定select是否可以處理如此多的連接,以及是否不會減慢來自服務器的響應(有必須通過客戶端套接字的循環)。所以可以爲許多客戶使用select?

我一直在尋找我的答案,但是,我沒有找到它,或者我只是不知道要搜索什麼。所以請不要不高興。對不起我的英語不好。

回答

3

一般來說,線程非常昂貴:每個線程都需要調用堆棧(通常爲兆字節)並在調度程序中使用任務。所以常見的建議是最多有幾十個線程(可能使用一些thread pool)。可能有一百個線程是合理的(在一些強大的服務器上),但是數千線程可能不合理:即使空閒線程也是昂貴的。

因此,我建議使用複用調用poll(2)(優於select,它通常對文件描述符的數量有一個硬編碼限制,內置大小爲fd_set)。您可能還會使用線程池來服務活動的連接(或請求)。其實,你所說的是C10K problem。您也可以使用epoll(7)

幾個event loop庫提供了一些有用的基礎設施:BTW libevlibeventGlib從GTK,...

,你可以有一個混合的方法:使用線程的處理池(也許在不同的機器上運行)池。

請注意,有些編譯器提供split stacks,的Go language旨在啓用許多「green threads」。

+0

真的非常感謝您的回答。這很有幫助:)我不知道epoll。我打算使用epoll。 – Pauli 2014-11-22 16:50:13

+0

您是否考慮過使用'libev'? – 2014-11-22 16:53:18

+0

是的,但我沒有這樣的經驗。也許以後。我不想讓它複雜化。我從來沒有編程過服務器,所以我必須先學習一些東西...... – Pauli 2014-11-22 17:10:18

相關問題