2009-05-29 85 views
6

我正在本地Linux服務器上測試服務器和客戶端在同一臺服務器上。在經過大約1024次連接後,在我的代碼中,我連接的地方連接被拒絕。起初,我認爲這是fd_set_max選擇1024的限制,並將服務器更改爲輪詢而不是選擇,我仍然沒有超過這個數字。我的ulimit -n設置爲2048,我監視服務器上的lsof,它達到了大約1033(不知道這是否是確切的數字)並且失敗。任何幫助深表感謝。爲什麼1024連接後連接被拒絕?

回答

-1

因此,經過多一點研究......它看起來像我的服務器端聽有一個隊列深度爲20我認爲多數民衆贊成的原因。你們有沒有人認爲這個問題呢?

問候

2

也許你已達到打開文件描述符的進程限制。

我不確定我是否正確理解您:您是否在同一個進程中同時擁有服務器端和客戶端?然後你將使用兩倍的文件描述符。這接近你看到的ulimit。如果情況並非如此,那麼問題可能出現在服務器端?也許服務器進程耗盡描述符,不能再接受更多的連接。

accept man page提到,你應該得到的返回值:

EMFILE
的每個進程限制打開的文件描述符已經達到。

ENFILE
系統已達到打開文件總數限制。

你會得到什麼樣的錯誤代碼?您顯然只能將已成功接入的連接添加到選擇民意調查

我知道你已經知道如何檢查的ulimit,但其他人可能不會:

ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 40448 
max locked memory  (kbytes, -l) 32 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 4096 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 40448 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 
+0

感謝您的快速反應,讓我詳細解釋一下,所以服務器和客戶端在機器中是兩個獨立的進程。服務器更多的是跟蹤所有新客戶端進程的管理器。因此,客戶端進程向在端口上偵聽的服務器註冊自己。一旦〜1024個客戶端註冊,未來的客戶端就會拒絕連接。我檢查了ulimit -a,並且我將它設置爲2048軟限制和4096硬限制。 – Gentoo 2009-05-29 01:33:57

+0

@Gentoo你在服務器的接受調用中遇到錯誤嗎?如果是這樣的話? – lothar 2009-05-29 01:37:10

+0

@Gentoo不幸的是,您需要知道接受的服務器返回值。也許在服務器上使用strace會對此有所瞭解。 – lothar 2009-05-29 01:42:44

0

是否有服務器打開了它接受每個連接單獨的日誌文件中的任何危險嗎?

另一個組說服務器有什麼上限?

我在一個程序中有一些代碼(好幾年前),它將最大文件大小設置爲1 MB。 '可惜的是,當它第一次被添加時,它增加了尺寸,但隨着時間的推移和文件限制的增長意味着後來它的尺寸正在縮小!有沒有可能服務器有類似的問題 - 它設置打開的文件的最大數量到一個可笑的高數字如1024?

0

對於大多數瑣碎問題的道歉:)
當你說「更改爲輪詢」時是否重新編譯服務器?服務器是否在同一個帳戶下運行?它是一個fork-或者可能是一個線程服務器?在客戶端致電connect()後,您獲得errno == ECONNREFUSED嗎?你能否確認你得到RST以迴應SYNtcpdump?客戶端端口號碼是否被重用? TIME_WAIT狀態中有連接嗎?

3

如果連接速度快於服務器呼叫accept(),掛起的連接隊列可能已滿。最大隊列長度由服務器中的第二個參數設置爲listen(),或者如果設置爲較低,則值爲sysctl net.core.somaxconn(通常爲128)。

-1

您的限制來自linux用戶限制。如果未指定,則linux限制爲1024個打開的文件。若要更改永久編輯/etc/security/limits.conf文件並添加

用戶軟NOFILE 16535 用戶很難NOFILE 16535

或控制檯嘗試

的ulimit -n 16535

問候

0

我看見你和一個錯誤的關閉(sock_fd)語句處理程序提出的意見。

你是否明確地關閉你的套接字 - close()或shutdown()。

我猜不是。你實際上有1024+以上的併發活動連接?爲了做到這一點,你必須要有pthreads。那是對的嗎?

0

我有相同的症狀。即使增加ulimit -n後,我仍然無法處理更多的1024個輸入連接...

我的問題是我使用了select,無法處理1024以上的socket-FD。所以當我增加了限制時,改變!!!(我未能在第一次注意到...)

因此,爲了幫助有類似問題的人:

如果你想超過1024座,你必須

  • 增加限制開放的FD(-n的ulimit)
  • ,你可能不使用select()(使用調查()代替)