php间歇性连接不上redis和mysql问题

问题
最近上线了一台之前的服务器拿来做php,然后把php的版本,拓展包全部和线上的版本保持了一致,为了以防万一把nginx的和php的配置文件,以及版本也全部高度一致,文件描述符和进程数也调整到了565535和10240,结果还是出了问题,请求略微多一些的时候很多php报错日志:
[22-Oct-2018 07:01:54 Asia/Shanghai] PHP Fatal error: Uncaught RedisException: Connection closed in /data/wwwroot/www.test.com/config/config.ini.php:3
[22-Oct-2018 07:01:58 Asia/Shanghai] Db Error: database connect failed. error info :Connection timed out. db config:array (等

分析
1、首次怀疑是php拓展包的原因,因为之前也有拓展包和软件版本不兼容的情况也是这个报错。于是2、对比phpinfo信息,各个拓展的版本,以及配置文件,发现完全一致。
3、接下来怀疑是类和参数,cat /etc/sysctl.conf进行对比,发现一致。
4、然后不死心的重新安装了所有拓展包!问题依旧存在。
5、然后开始怀疑是不上tcp端口数不够用。于是开始用ss进程每分钟检测,发现完全够用
6、之后没有办法了,去查系统日志message,终于在相同的时间点发现问题:kernel: nf_conntrack: table full, dropping packet.很多这个报错,终于找到了,查了下发现是内核参数net.nf_conntrack_max设置太小的问题。

原因
服务器访问量大,内核netfilter模块conntrack相关参数配置不合理,导致新连接被drop掉。防火墙相关的参数

解决
修改内核配置:vim /etc/sysctl.conf
net.netfilter.nf_conntrack_max=1048576
net.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
使它生效sysctl -p
目前持续观察中

总结
检查内核的时候可能不是每个内核参数都有配置,对比的时候可以sysctl -a,以及多查看系统日志,有时候就是能发现原因。

转载于:https://blog.51cto.com/huangmoumou/2336039

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值