最近在研究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
版权声明:本文为博主原创文章,转载请附上博文链接!