工作环境
操作系统:Linux ( Ubuntu server 12.04 / 64 bit)
内核版:Linux Ubuntu-Server 3.13.0-32-generic
1:连接限制
- 文件句柄限制
在 linux 下网络编程每一个 tcp 连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can’t open so many files”。
这时需要明白操作系统对可以打开的最大文件数的限制。
- 进程限制
查看系统允许当前用户进程打开的文件数限制
ulimit -n
//默认输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以如果采用此默认配置单进程最多可以并发上千个 TCP 连接。
1. 修改/etc/security/limits.conf文件,在文件中添加如下行:
* soft nofile 204800
* hard nofile 204800
// * 代表所有用户
2. 修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/x86_64-linux-gnu/security/pam_limits.so
// 这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量
// 的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf
// 文件中读取配置来设置这些限制值。修改完后保存此文件。
- 全局限制
查看Linux系统级的最大打开文件数限制,使用如下命令:
cat /proc/sys/fs/file-max
//显示的是这台Linux系统最多允许同时打开(即包含所有用户打开)文件数总和,是Linux系统级硬限制,
//所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源
//状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件
//数限制设置超过此限制的值。
cat /proc/sys/fs/file-nr
// 输出 9344 0 592026,分别为:1.已经分配的文件句柄数,2.已经分配但没有使用的文件句柄数,3.最大文件句柄数。但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。
用 root 权限修改 /etc/sysctl.conf 文件,把这个数值改大些:
net.nf_conntrack_max = 204800
net.netfilter.nf_conntrack_max = 204800
/sbin/sysctl -p //立即生效
/sbin/sysctl net.netfilter