文件句柄数限制###
两个事实:1)*nix系统中,一切都用文件来描述。2)操作系统会对单个进程打开的最大“文件”数量进行控制。
结论:你的模型再牛逼,因为这个限制,你也只能打开操作系统规定的那些个连接。
- 单个进程的限制
ulimit命令:ulimit -n 在linux返回1024,最多打开1024个文件,修改这个值用ulimit -SHn <number>来做。永久修改
请加入到.bashrc中。- 操作系统范围内总数的限制
/etc/sysctl.conf
fs.file-max = 1000000
net.ipv4.conntrack_max=1000000
net.ipv4.netfilter.ip_conntrack_max = 1000000
上述两个值待查阅资料更新
端口号限制###
容易混淆的点:accept返回的是文件描述符,而不是端口号,服务器来讲,你accept多少连接,你的客户都跟你bind的那一个端口进行通信,所以服务器能接受的最大连接数(不考虑参数限制),是客户端ip数 × 客户端端口数,也就是2^32 × 2^16 = 2^48,这是服务器理论上能接受的最大连接数,跟你本地支持多少个端口没有关系。
觉得很有道理的TCP调优###
- 增大Tcp的初始拥塞窗口:有很多突发性(而且很有可能传输大量数据)的短连接,这是特别重要的一个优化,TCP还在慢启动,数据传输就结束了。
落地改法:网上介绍的好像只有改内核,并在内核中通过/proc文件系统控制这个值
- 慢启动重启:连接空闲时,禁用慢启动重启,将会显著改善突发性传送数据的TCP长连接的性能。
$> sysctl -w net.ipv4.tcp_slow_start_after_idle=0
- 启动窗口缩放将增大最大接收窗口大小。
$> sysctl -w net.ipv4.tcp_slow_start_after_idle=0
- TCP快速打开:允许第一个TCP SYN分组发送应用数据,这需要服务器和客户共同支持。