受网上很多帖子影响,一直认为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
修改后,需要重启机器生效。