现象:
项目出现操作卡顿,接口http 500,但是日志并没有该接口业务报错,但是日志有
ERROR - **** --> Severity: Warning --> Unknown: Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp) Unknown 0
ERROR - **** --> Severity: error --> Exception: Cannot assign requested address /var/www/html/**/system/libraries/Session/drivers/Session_redis_driver.php 179
原因:
客户端链接频繁,TCP未及时释放,端口耗尽,导致无法分配端口,无法分配请求的地址
解决方式:
优化服务器配置:
/proc/sys/net/ipv4/
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward=1
# 修改命令行
#可以通过
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
或者
echo 30 >> /proc/sys/net/ipv4/tcp_fin_timeout
# 让 修改生效
/sbin/sysctl -p
配置解释:
net.ipv4.tcp_fin_timeout = 60
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,(可改为30,一般来说FIN-WAIT-2的连接也极少)
net.ipv4.tcp_tw_reuse = 0
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_syncookies
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 0
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.ip_forward=1
#表示是否打开IP转发 0:禁止,1:转发
#基本用途:如VPN、路由产品的利用;
#出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。
#配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能
#less /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。
#可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可将命令echo "1" > /proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local 或者 在/etc/sysconfig/network脚本中添加 FORWARD_IPV4="YES"
扩展:
#在存在大量短连接的情况下,Linux的TCP栈一般都会生成大量的 TIME_WAIT 状态的socket。可以用下面的命令看到
netstat -ant| grep -i time_wait
#看到数目
netstat -ant|grep -i time_wait |wc -l