1.修改主机能打开的最大文件描述符数量
当服务器出现报错"Too many open files"时,说明服务端的能打开的最大文件描述符数量不够用了,需要增加。
查看进程能打开的最大文件描述符数量:
[root@master ~]# ulimit -n
1024
假设要修改能打开的最大文件描述符数量为100W:
# vim /etc/sysctl.conf
fs.file-max=1100000 # 系统级别设置为100W,多留点buffer
fs.nr_open=1100000 # 进程级别也设置为110W,因为要保证比hard nofile大
# sysctl -p
# limits.conf中的hard nofile不能超过nr_open参数,否则启动的时候会有问题
# 用户级别设置 *为通配符,表示为所有用户设置
# vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
重启后再次查看:
[root@master ~]# ulimit -n
1000000
2.修改主机可用端口范围
客户端出现"Cannot assign requested address"时说明没有可用端口了,需要扩大可用的端口范围了。
一条TCP连接由一个四元组组成:Server IP、Server Port、Client IP、Client Port。在连接建立前,前面的三个元素是确定的,只有Client Port是需要内核动态选择出来的(也可以自己指定)。
客户端会在connect发起的时候自动选择端口号。具体的选择过程就是随机地从ip_local_port_range选择一个位置开始循环判断,跳过ip_local_reserved_ports里设置的要规避的端口,然后挨个判断是否可用。如果循环完也没有找到可用端口,会报错"Cannot assign requested address"。
解决这个问题的方法可用扩大可用端口范围或者减小最大TIME_WAIT状态连接数量:
# vim /ect/sysctl.conf
net.ipv4.ip_local_port_range = 5000 65000 # 可用端口范围设置为 5000 - 65000
# 设置最大TIME_WAIT数量
net.ipv4.tcp_max_tw_buckets = 10000
# sysctl -p