2015-06-05 60 views
0

我正在AWS虛擬機(ubuntu)上開發一個用於在線安卓遊戲的java服務器。我做了一個測試,表明我最多可以連接到服務器4080客戶端。如果有更多客戶想連接,我會得到「SocketException:打開太多文件」。我檢查了限制的數量:「ulimit -n」給我1024.將它改爲4096並沒有改變。Ubuntu上的TCP連接的最大數量

爲任何接受的套接字創建一個新線程,它們當前不執行任何操作,直到停止服務器爲止。

在建立了所有4080個連接後,我觀察到使用了大約1GB的ram。我總共有2GB。

我們該如何處理更多的tcp連接?我的多線程方法是否有用,或者我應該爲成千上萬的客戶遵循不同的方法?

+1

沒有看到代碼,我不能發表評論。雖然,看起來你每次請求都會打開新的套接字。 –

+0

@ bobs_007你的猜測是正確的。 – user3703595

+0

@ user3703595你的問題是關於配置你的操作系統,而不是一個特定的java問題。無論如何,你可以檢查例如你是否需要任何新客戶端的套接字。你有沒有聽說過java nio? (http://archive.oreilly.com/pub/a/onjava/2004/09/01/nio.html) – GhostCat

回答

0

ulimit變量實際上並不是系統參數。它們根據流程屬性進行設置並由兒童嵌套。請確保你從已經提出ulimit的進程運行你的java服務器。

+0

我該怎麼做?我只是以root身份輸入ulimit -n 4096。 – user3703595

+0

由於您可以啓動4080個客戶,我認爲這不是問題。您需要運行ulimit __before__,在同一個shell中啓動JAVA進程 –

0

UX上的每個子進程繼承所有打開的文件描述符從它的父。產生一個孩子作爲網絡客戶端是有點棘手的,因爲你需要明確地關閉孩子中的所有不必要的描述符(即,stdin,out和err,即0,1,2)。

這也涉及到開放套接字(無論是古老的「一切皆文件」的政策),所以如果你有一個插座上的監聽和生成一個子,它已經有此套接字打開。您可以將複製此插槽,但需要關閉原來在孩子等