2012-11-27 26 views
0

使用linux BSD套接字,如果活動連接數 溢出系統限制會發生什麼情況?會接受回撥錯誤?在linux下處理c10k

即使系統可以接受不確定的套接字連接, 可以超過整數最大值的大小嗎?

套接字描述符是一個4字節的整數值。 是否公平地說,在32位系統中單個進程維護多於 4294967295的活動TCP連接是不可能的? (假設硬件和操作系統都支持這一點,服務質量並不重要,我們只想維持活動的TCP連接)

這可能是一個愚蠢的問題,但我很好奇。

回答

1

由於文件描述符是ints,所以你顯然不能超過4G文件描述符。即使在64位系統上也是如此,因爲sizeof(int)仍然是4.理論上,您可以跨多個進程打開更多文件描述符。即使你增加了所有的/ proc限制,你可能會首先耗盡內核內存。

linux內核中的每插槽分配都在千字節範圍內,所以即使在大型服務器(具有許多GB的RAM)上,最大連接數也是以百萬計,而不是數十億計。

1

從Linux系統上接受(2)手冊頁:


     EMFILE The per-process limit of open file descriptors has been reached. 

     ENFILE The system limit on the total number of open files has been reached. 

     ENOBUFS, ENOMEM 
       Not enough free memory. This often means that the memory allocation is limited by the socket buffer limits, not by the 
       system memory. 

所以,是的,在任何remotedly理智的配置接受將報告EMFILE或ENFILE。如果您將fd限制設置爲某個天高的值,您可能會獲得ENOBUFS/ENOMEM。在int數據類型的INT_MAX限制之前,您可能會達到這些限制。