生产服务器在高峰的时候经常报错,查看日志记录为:
Redis->connect('127.0.0.1', 6379, 1)
#1 {main}
thrown in /home/wwwroot/55mx.com/test.php on line 9
[13-Jun-2019 11:07:47 PRC] PHP Fatal error: Uncaught RedisException: Cannot assign requested address in /home/wwwroot/55mx.com/test.php:9
从网上找了解决办法:
执行命令修改如下2个内核参数
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
Redis 错误 :Cannot assign request
Could not connect to Redis at 127.0.0.1:6379: connect: Cannot assign request
经查官方Wiki是系统网络配置问题已经解决:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
以上需要root权限对网络进行配置。
通过调整内核参数解决,vim /etc/sysctl.conf,加入
net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭,释放TIME_WAIT端口给新连接使用;
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收资源,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 #修改系統默认的 TIMEOUT 时间,调低端口释放后的等待时间,默认为60s,修改为15~30s
net.ipv4.tcp_max_tw_buckets = 10000#通过设置它,系统会将多余的TIME_WAIT删除掉,此时系统日志里可能会显示:『TCP: time wait bucket table overflow』,多数情况下不用在意这些信息。
然后执行 /sbin/sysctl -p 让参数生效。
以上都可以通过命令(sysctl -w)方式操作,如:sysctl -w net.ipv4.tcp_fin_timeout=30 ,只适合临时修改参数。
TCP网络参数优化
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range设置向外连接可用端口范围 表示可以使用的端口为65535-1024个(0~1024为受保护的)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 设置time_wait连接重用 默认0
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle 设置快速回收time_wait连接 默认0
echo 180000 > /proc/sys/net/ipv4/tcp_max_tw_buckets 设置最大time_wait连接长度 默认262144
echo 1 > /proc/sys/net/ipv4/tcp_timestamps 设置是否启用比超时重发更精确的方法来启用对RTT的计算 默认0
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling 设置TCP/IP会话的滑动窗口大小是否可变 默认1
echo 20000 > /proc/sys/net/ipv4/tcp_max_syn_backlog 设置最大处于等待客户端没有应答的连接数 默认2048
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout 设置FIN-WAIT状态等待回收时间 默认60
echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem 设置最大TCP数据发送缓冲大小,分别为最小、默认和最大值 默认4096 87380 4194304
echo "4096 65536 16777216" > /proc/sys/net/ipv4/tcp_wmem 设置最大TCP数据 接受缓冲大小,分别为最小、默认和最大值 默认4096 87380 4194304
echo 10000 > /proc/sys/net/core/somaxconn 设置每一个处于监听状态的端口的监听队列的长度 默认128
echo 10000 > /proc/sys/net/core/netdev_max_backlog 设置最大等待cpu处理的包的数目 默认1000
echo 16777216 > /proc/sys/net/core/rmem_max 设置最大的系统套接字数据接受缓冲大小 默认124928
echo 262144 > /proc/sys/net/core/rmem_default 设置默认的系统套接字数据接受缓冲大小 默认124928
echo 16777216 > /proc/sys/net/core/wmem_max 设置最大的系统套接字数据发送缓冲大小 默认124928
echo 262144 > /proc/sys/net/core/wmem_default 设置默认的系统套接字数据发送缓冲大小 默认124928
echo 2000000 > /proc/sys/fs/file-max 设置最大打开文件数 默认385583
结合ab命令来压测机器优化网络
设置完记得保存
优化Redis 命令:
设置内存分配方式:
echo 1 > /proc/sys/vm/overcommit_memory
0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2 表示内核允许分配超过所有物理内存和交换空间总和的内存
关闭THP:
cho never > /sys/kernel/mm/transparent_hugepage/enabled
尽管THP的本意是为提升性能,但某些数据库厂商还是建议直接关闭THP(比如说Oracle、MongoDB等),否则可能导致性能下降,内存锁,甚至系统重启等问题。
echo 1024 >/proc/sys/net/core/somaxconn
限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache),常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/44
《解决Redis由于连接过多导致的Uncaught RedisException: Cannot assign requeste问题》的网友评论(0)