2011-05-05 51 views
1

當前情況:我有一個Linux服務器(與陌生人聊天)設置,我對效率有疑問。存儲套接字信息隨機訪問速度

目前我使用的地圖在一個簡單的管理類來配對兩個陌生人:

int sockManager::set_pair(int me, int them) { 
if (them != -1) { 
    pairs[me] = them; 
    pairs[them] = me; 
    return 1; 
} 
return -1; 
} 
int sockManager::get_pair(int me) { 
return pairs[me]; 
} 
void sockManager::add_single(int me) { 
pairs[me] = -1; 
} 
void sockManager::remove_single(int me) { 
if (pairs[me] != -1) 
    pairs[pairs[me]] = -1; 
pairs.erase(me); 
} 
int sockManager::find_unconnected(int me) { 
if (pairs[me] != -1) 
return pairs[me]; 
for (iter = pairs.begin();iter!=pairs.end();iter++){ 
    if (iter->second == -1 && iter->first != me) 
    return iter->first; 
} 
return -1; 
} 
int sockManager::get_size(){ 
return pairs.size(); 
} 

我使用這個管理器類的原因是可擴展性。比如在這個時候,我想改變我發現兩個客戶端連接的方式。我想要有一個「需要連接」標記,並且有一個簡單的線程可以持續運行並找到客戶端進行連接,當客戶端無法連接時,如果時間超過x秒,則發送它們一個有趣的說法或某事(讓他們招待)我還需要確保客戶端沒有連接到別人使用相同的IP地址作爲他們的...

這裏的問題: 我使用一個映射來存儲每個套接字,它是相應的合作伙伴。是否有另一種更快的方式來存儲每個套接字和合作夥伴組合? (對於隨機訪問,就像查找int [套接字]與映射方法的速度一樣)。 {是否使用結構數組作爲我的最初問題,然後我意識到這將是愚蠢的...文件描述符每次漲不上去了1所以這將是完全無用認爲陣列將加快東西}

主觀(ISH)問題: 我想用來存儲標誌爲每個連接,你認爲最好也是最容易展開的方法是將地圖對的值(與鍵相對)變成一個持有必要信息(夥伴套接字,連接標誌,標誌...)的結構,或者我應該製作另一個地圖特別是國旗成員的價值?內存不會是一個問題。

三更堅實[& &略有無關]問題: 我使用的是FD_SET與select()函數,和我讀過它與大量的FD的(我知道它可以處理的非常慢最大1024,但同樣適用於poll())我將如何去實現基於事件的系統來監聽來自用戶的傳入數據? (操作系統:Ubuntu的Linux)和它會更快?我壓力測試了我的服務器,我可以在整個網絡上處理幾百個客戶端,而用戶端卻沒有明顯的放緩。我想一次支持3k以上。

我想通了更多的問這個問題,實現了多少愚蠢的問題我要問不是東西了幾個小時讀了...

回答

2

我怎麼會去實現一個 事件基於系統來監聽用戶輸入的數據 ? (操作系統:Ubuntu的 Linux),它會多快? 我已經強調測試了我的服務器,因爲它是 ,我可以在網絡上處理幾百個客戶端 ,而用戶的 端沒有 明顯減速。我一次最多支持 3k。

通常情況下,人們試圖解決c10k problem將使用一個事件處理循環由libeventMTasker提供。線程通常會讓你處於低數百位而沒有太多麻煩,但是在某些時候內存使用會變得非常嚴格。基於事件的編程通常可以讓服務器擴展到數千個,但這取決於很多因素。

+0

謝謝,我現在正在與libevent合作。 – ultifinitus 2011-05-05 13:41:37