问题一:
accept4: too many open files; retrying in 640ms
或者
dial tcp 127.0.0.1:8080: socket: too many open files
都是socket的数量,即文件描述符的数量不够用了,解决方法,增加文件描述符的数量
ulimit -n 204800
其中204800可以适当增加,不超过系统上限就行。
问题二:
dial tcp 127.0.0.1:8080: connect: cannot assign requested address
这个是端口不够用了,一般计算机的端口最多是65535个
查询的方法:
sysctl -a |grep port_range
解决的方法是:
vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10000 65000
sysctl -p
更直接的方法:
多配几个ip
ifconfig eth0:1 xxx
ifconfig eth0:2 xxx
出现问题的原因:
netstat -ano
可见大量的state是time_wait的连接,释放这些连接可以避免问题。
方法是:
sysctl -w net.ipv4.tcp_fin_timeout=30 调低端口释放后的等待时间,默认为60s,修改为15~30s
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
总之,只要程序写的还行的话,受限的资源无外乎socket的文件数量或者端口数量,把数量改大了或者及时释放了,是解决问题的主要思路。