受網上很多帖子影響,一直認為Unix、Linux下單個進程打開句柄數目上限是65535,不能超過這個值,最近從網上看到另一種描述,在SUSE、RedHat都測試了一下,單個進程完全可以支持到100萬以上的句柄。
關於系統文件句柄的幾個限制從大往小排列:
/proc/sys/fs/nr_open
系統文件系統支持文件句柄總數上限,默認值1048576(1M),Linux2.6.25開始增加該內核參數,用於替換內核宏NR_OPEN(1048576),該值上限受限於系統內存。
在linux 2.26.32平台執行“man 5 proc”沒有看到“/proc/sys/fs/nr_open”,只看到NR_OPEN參數限制/proc/sys/fs/file-max。
/proc/sys/fs/file-max
系統文件系統支持文件句柄總數最大值,必須小於/proc/sys/fs/nr_open或NR_OPEN,增加該值時,必須同步修改/proc/sys/fs/inode-max = 4*/proc/sys/fs/file-max。
ulimit -Hn
單個進程句柄數硬上限,默認值1024,不能大於/proc/sys/fs/file-max,修改方法不多講。
ulimit -Hn
單個進程句柄數軟上限,默認值1024,不能大於“ulimit -Hn”硬上限,修改方法不多講。
FD_SETSIZE
Linux環境一個C語言的宏定義,在/usr/include/bits/typesize.h或有定義,默認值1024,到目前為止,我只確認該宏定義限制FD_SET()、FD_CLR()操作的文件描述符值,猜測應該是Linux早期版本遺留下來的一個限制。既然select()操作已經淘汰了,這個宏定義應該也沒用了。如果要使用select()系列操作,可以在gcc編譯時定義該宏“-DFD_SETSIZE=65535”。
手工修改操作系統句柄,請按照下表修改配置:
操作系統
查看句柄數方法
修改句柄數方法
Linux
ulimit -Sn
---查看句柄數軟限制
ulimit -Hn
---查看句柄數硬限制
檢查/etc/security/limits.conf文件,修改或增加如下配置:
* hard nofile 65536
* soft nofile 65535
在/etc/pam.d/su、/etc/pam.d/xdm、/etc/pam.d/login文件增加如下配置:
session required pam_limits.so
HP
kctune -q maxfiles
---查看句柄數軟限制
kctune -q maxfiles_lim
---查看句柄數硬限制
執行命令修改:
kctune maxfiles>=XXX
XXX范圍【32,maxfiles_lim】,maxfiles_lim的取值范圍【32,1048576】,但是大於65535時,某些老版本的文件函數不兼容。
maxfiles修改後,必須重啟操作系統生效。
Aix
ulimit -Sn
---查看句柄數軟限制
ulimit -Hn
---查看句柄數硬限制
檢查/etc/security/limits文件,增加修改如下配置:
nofiles = -1
nofiles_hard=-1
在AIX6測試驗證:即使配置為ulimited,單個進程只能打開65535個句柄。
Solaris
ulimit -Sn
---查看句柄數軟限制
ulimit -Hn
---查看句柄數硬限制
檢查/etc/system文件,增加修改如下配置:
rlim_fd_max=65535
rlim_fd_cur=65535
修改後,需要重啟機器生效。