[转]linux对文件描述符的种种限制

最近在研究linux服务器下TCP的最大连接数问题,因为系统为每个TCP连接都要创建一个socket句柄,而每个socket句柄同时也是一个文件句柄,所以就专门对linux下文件描述符的种种限制作了一些深入的研究:

1,ulimit  -n 65556

ulimit -n是用来查看用户单一进程可同时打开的最大文件数,默认情况下是1024,我们通过ulimit -n 65536,将最大文件数修改为65536,此修改只对当前会话有效。

当然,ulimit还有其他的用法,比如ulimit -a就能够显示系统资源的各种限制,这里就不再继续讲解,有兴趣的童鞋可以继续深入挖掘下~

2,/etc/security/limits.conf

看其所在文件夹和文件名字我们也可以猜到,这个是为了linux的性能、安全而设计的一些限制,那么如果我们要修改最大可打开的文件句柄数,我们可以在limits.conf在增加如下代码:

* soft nofile 65536

* hard nofile 65536

这里面会有几个概念,比如nofile参数、软限制与硬限制等等,大家也可以自己继续挖掘下。

3,cat proc/sys/fs/file-max:

内核参数:linux内核将分配的最大的文件句柄数,所有进程一共可以打开的文件数量。

还有一个是:cat /proc/sys/fs/file-nr: 5728  0  61763

                     第一个参数:代表已分配的文件句柄
                     第二个参数:代表已使用的文件句柄
                    第三个参数:代表文件句柄的最大值

为了继续寻找文件限制的相关证据,我又进行了深入的挖掘,在深入理解linux内核的第三版中有这样一些描述:

The files_init() function, executed during kernel initialization, sets the max_files to one-tenth of the available RAM in kilobytes, bute the system administrator can tune this parameter by writing into the /proc/sys/fs/file-max file.

上面这段即是:
内存初始化期间,files_init()函数把max_files字段设置为可用RAM大小的1/10(kilobytes),不过,系统管理员可以通过写/proc/sys/fs/file-max文件来修改这个值。

而能改到多大,就没有这个说法了。

而在linux内核源代码:files_init()内则有:
 /*
  * One file with associated inode and dcache is very roughly 1K.
  * Per default don't use more than 10% of our memory for files.
  */

 n = (mempages * (PAGE_SIZE / 1024)) / 10;
 files_stat.max_files = n;
通过上面的一段描述:我们知道,带inode和dcache的一个文件大概就是1K(bit),而我们接收到的建议是文件的使用不超过10%的内存使用量。

总结:linux的最大可打开文件数是可修改的,但具体能修改到多大,这要看机器的内存情况了。按照这个说法,tcp的连接数限制条件中的文件打开数,我们就可以通过修改文件限制参数和扩展内存来增加。至于tcp连接数的其他限制条件,则要在之后继续研究了。

引用文章:

http://www.cnblogs.com/mydomain/archive/2013/05/27/3100835.html

http://soft.chinabyte.com/os/285/12349285.shtml

http://blog.sina.com.cn/s/blog_6f5b22060101362c.html
---------------------
作者:乱码特轻松
来源:CSDN
原文:https://blog.csdn.net/fox_hacker/article/details/41148115
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/tlmn2008/p/10748516.html