2010-01-24 63 views
9

erlang TCP/IP庫是否有一些限制?我做了一些搜索,但找不到任何明確的答案。Erlang同時開放端口的最大數量?

我已經將ERL_MAX_PORTS環境變量設置爲12000,並將Yaws配置爲使用無限連接。

我已經編寫了一個簡單的客戶端應用程序,它連接到我爲Yaws編寫的appmod,並且通過同時啓動X個客戶端來測試同時連接的數量。

我發現,當我得到約100名客戶中,雅司病服務器停止接受更多的TCP連接,並在客戶端的錯誤出與

 
Error in process with exit value: {{badmatch,{error,socket_closed_remotely}} 

我知道必須有開放的併發連接數的限制,但100似乎真的很低。我瀏覽了所有的雅司文檔,並刪除了連接的限制。

這是運行Snow Leopard的2.16Ghz Intel Core 2 Duo iMac。

對Vista機器的快速測試表明,在約300個連接處出現同樣的問題。

我的測試不合理嗎?即同時打開100多個連接來測試Yaws的併發性是否很愚蠢?

謝謝。

+0

是否'socket_closed_remotely'表明問題出在客戶端? – Zed 2010-01-24 19:03:05

+0

編輯完成後更新了我的答案,可能是因爲您同時打開了所有答案。 – stacker 2010-01-24 20:14:52

+0

Zed:錯誤消息來自客戶端,所以Yaws關閉了套接字。我沒有看到任何記錄在Yaws中的東西。 – ckovacs 2010-01-25 02:59:53

回答

0

在嘗試了每個人的建議並沖刷Erlang文檔後,我得出結論,我的問題是Yaws無法跟上負載。

在同一臺計算機上,Apache Http Components Web服務器(非阻塞I/O)在處理相同閾值的連接時沒有相同的問題。

感謝您的幫助。我將轉向其他基於erlang的Web服務器,如Mochiweb。

+0

嗯,當然,您的答案不是正確的答案。 – Farsheed 2017-09-01 01:57:58

6

看來你打了一個系統的限制,嘗試使用

$ ulimit -n 500 

Python on Snow Leopard, how to open >255 sockets?

二郎本身有1024年的限制,以增加打開文件的最大數量:

http://www.erlang.org/doc/man/erlang.html

默認情況下,可以同時打開的最大端口數爲1024,但可以通過環境配置va可翻轉的ERL_MAX_PORTS。

編輯:

系統調用listen() 有一個參數積壓,確定多少個請求進行排隊,請請求建立連接之間的延遲是否有所幫助。這可能是你的問題。

+1

如果最大端口被耗盡,錯誤將是'enfile'而不是'socket_closed_remotely'。 – Zed 2010-01-24 13:14:49

+0

對不起,我忘記提及我在OS X和Vista設置中將ERL_MAX_PORTS設置爲12000 – ckovacs 2010-01-24 16:51:36

+0

還嘗試使用相同結果設置ulimit – ckovacs 2010-01-24 17:03:57

3

所有的Erlang系統限制的報道二郎山效率指南:

http://erlang.org/doc/efficiency_guide/advanced.html#id2265856

開放端口讀部分:

的同時 開放二郎端口的最大數量是默認爲1024。 此限制可升高到至多 268435456在啓動時(參見環境 變量ERL_MAX_PORTS Erlang中(3)) 的268435456個開放 端口的最大限制將至少在32位 架構是不可能達到 由於內存不足。