最近接的項目是類比多個socket 用戶端與伺服器進行通訊。由於Linux 系統的限制,在/usr/include/linux/posix_types.h檔案中有如下的宏定義:
#undef __FD_SETSIZE
#define __FD_SETSIZE 1024
這個宏是對最大檔案描述符的定義為1024。當需要1024個以上的fd時,例如select()函數就會偵聽出錯。因此需要將1024改成需要的數目,但最多不能超過65535。但僅僅修改這個是不夠的。
第二步就需要修改一個進程最大開啟的檔案數。其具體步驟是:
1、cd /usr/src/linux-2.4/include/linux
2、vi limits.h 編輯檔案:
#define NR_OPEN 90240 原值為1024
#define OPEN_MAX 10240 原值為1024
3、vi fs.h
#define INR_OPEN 10240 原值為1024
#define NR_FILE 65536 原值為8192,這個值為記憶體64/1M的比率計算,1G記憶體計算為:64*1024
#define NR_RESERVED_FILES 128 原值為10.
4、cd /usr/src/linux-2.4/include/net
5、vi tcp.h
#define TCP_LHTABLE_SIZE 128 原值為32.便於listen偵聽隊列,設大。
設定最大開啟檔案數與記憶體相關,太大系統會變慢。
第三步就是編譯核心,其具體步驟是:
1. make clean
2. make
3. make dep
4. make bzImage
將bzImage 匯入/boot 重啟系統即可!
用 1024個以上用戶端與伺服器進行串連,在伺服器的終端用netstat |wc 命令可以統計出當前建立的socket的串連數。
來自:http://www.360doc.com/content/10/0617/16/61151_33617404.shtml