受网上很多帖子影响,一直认为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 修改后,需要重启机器生效。 |
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-04/116392.htm