1 查看本机一个进程最大的socket描述符上限
可以使用cat命令查看一个进程可以打开的socket描述符上限。
cat /proc/sys/fs/file-max
下面结果就是你的计算机最大可以打开的文件描述符上限,因为我的虚拟机是12.04很久的测试机,所以就是十万左右,比较低。
2 修改一个进程可以打开的socket描述符上限
上面我们说了一个计算机可以最大打开的文件描述符,注意上面的值确实是已经是最大的打开值,但是我们可以认为的在[0,101026]这个范围去调整一个进程最大的上限。但一般不需要改变,因为很少用到。如有需要,可以通过修改配置文件的方式修改该上限值。
sudo vi /etc/security/limits.conf
#在文件尾部写入以下配置,soft软限制,hard硬限制。如下图所示。,注意中间最好以tab对齐。
* soft nofile 65536 #默认电脑开启时,一个进程最大打开的文件描述符个数,可用ulimit -a查了open file,下面会进行讲解
* hard nofile 100000 #命令修改上限,也就是让我们在[0,101026]这个范围去调整一个进程最大的上限。
3 ulimit命令修改soft nofile默认单个进程的socket上限数
上面修改配置文件后,我们可以使用ulimit -a查看当前用户的一个进程最大文件描述符个数(注意上面的配置文件改后,所有的终端都会生效,也就是当前用户)。
-
1)修改上面配置文件前,可以使用ulimit -a查看默认的soft nofile上限数,默认为1024(不查看也行)。然后修改配置文件后,将当前用户重启使配置文件生效。
-
2)重启后,再次查看ulimit -a。
ulimit -a
结果如下:
- 3)此时我们也可以修改默认单个进程的最大socket上限数。
ulimit -n 20000
- 4)但是需要注意一点,当我们修改默认值后,它只能往下调整,不能再往上调整(第一次启动时是可以往上提的,此后就不能了,只能重启,也就是说每次启动只有一次往上提的机会),即使是root也不行。
- 5)若想重新往上调整,只能使当前用户重启,让刚刚的配置文件生效,这样就可以重新回到默认值65536。
- 重启后的结果:
4 总结
突破文件描述符上限一般的步骤是:
- 1)按上面先修改配置文件/etc/security/limits.conf,然后重启生效。
- 2)使用ulimit -n xxx修改自己规定的单个进程最大允许socket个数。
- 3)hard nofile 100000硬件这个值,一旦我们配置完之后就用不到,不需要理会。我们使用ulimit -n修改的是soft nofile软限制。
- 4)而这个修改主要是针对poll,epoll这两个函数。select是没有作用的,因为它最大1024,即使修改了配置文件也无法突破这个限制。