环境:
8台机器 32C 256G,redis 6主6从在同一台机器上,dashbaord也在redis00上。codis-proxy 开8C,每台机器开2个proxy。万M网络,CentosOS 6.5 内核2.6.32-431.el6.x86_64。
现象:
sprak 70台机器 向codis写 开启pipline,不控制pipline大小,同时调度400个CPU,有大量reset报错。长链接。
排查:
1、Redis没有报错
2、查看qps 流量很低
3、Codis proxy 没有报错,通过网页查看流量过山车
一时无法定位问题
解决方案:
方案一:
把codis-proxy 从 redis分开,分4台,cpu 30C ,每台要机器部署1个codis-proxy日志级别调到warn,
此方案未解决问题,问题依然出现。
通过tcpdump:tcpdump -i bond0 -vnn port 9100 >tcp.log
一个pipline seesion的读写buffers各13M,生产速度大于消费时,各session的buffers不够用,将停止消费,服务端tcp协议将窗口不断放小直到0。长时间处于0窗口的话,tcp协议会给对端发reset。所以业务端老看到reset。
方案二:
调整codis_proxy 参数:session_max_bufsize=231072 每一个seesion 20M左右。
调整spark 端写速度pipline 5000个一发,(pipline 5000 , spark端一次发5000个给codis,codis处理完之后在返回给spark在5000个。) spark端会调200个进程每一个进程5000:200X5000=1000000 理论会有1000000万ops,tcp会有一些限速。最终稳定值在70多万。
网络情况:
这只是in的值250MB,进出总 量在500MB左右。
spark端没有报错。
实验:spark pipline 10000万一发,峰值达到:
是的你没有看错:700多万。
700万并发,业务端出现了问题,而且700万量太大对网络也是一个压力,因此,我们经测试200万,属于一个业务和运维都可以接受的值!
还能在提速吗?
如果窄干机机器性能:
1、调速CPU中断,CPU默认中断都在第一个CPU上,
cat /proc/interrupts >f
vim f 打开这个文件 set nowrap 让他按行排列
set nowrap
可以看到这些中断在0上最多。
2、调整网卡队列