查看进程能够打开的最大数目的文件描述符
cat /proc/sys/fs/file-max
修改最大文件描述符限制
vim /etc/security/limits.conf
问题:
一个进程在 linux 上能打开的文件句柄数是有限的,因为内核用 16位的 short 来表示文件句柄数,那么最大值是不是 65536 呢?
而accept一个socket连接,也是要在系统本地创建一个文件的,就占用了这个 socket server 进程的一个文件句柄,这样算下来,一个进程是不是理论上最多就能保持 65536个长连接呢(1024 以下一般保留)?
一个 jvm 上启动一个java的socket server 应该算是一个系统进程吧?那么这个进程是怎么维持 65536 以上的长连接的呢?
某网友的回答:
nio 在linux上使用的是epoll ,epoll支持在一个进程中打开的FD是操作系统最大文件句柄数,而不是你所说的16位short表示的文件句柄。 而 select模型 单进程打开的FD是受限的 select模型默认FD是1024 。操作系统最大文件句柄数跟内存有关,1GB内存的机器上,大概是10万个句柄左右。可以通过cat /proc/sys/fs/file-max 查看
epoll把用户关心的文件描述符上的时间放在内核的一个事件表中,无需像select和poll那样每次调用都重复传入文件描述符集。
epoll在获取事件的时候,无需遍历整个被监听的文件描述符集合,而是遍历那些被内核IO事件异步唤醒而加入ready队列的描述符集合。
参考文章:
https://blog.csdn.net/men_wen/article/details/53456491
https://blog.csdn.net/u014252563/article/details/51531514