我有一个类似秒杀活动,主要逻辑由redis支撑,考虑到可能的并发量,对redis进行了分片,在秒杀时候使用round robin方式从redis中进行秒杀逻辑(配合lua脚本),如果当前redis被秒杀完则会将当前redis从可用列表中排除后再次round robin到下一个redis上。整个同步请求流程有7次redis请求,redis请求命令(包括lua脚本)时间复杂度绝大部分为O(1),仅有少数O(logN)的操作。
现在情况是在并发1k时(tps 45k左右,并发500,tps37k),服务端计时日志(日志输出异步,服务端若干台,且cpu使用低于350%,24核)显示出来执行耗时会无规律偏高(频率大概在每万次上百,整理耗时会达到1s甚至更高)。
检查整个环境,redis主从(主关闭aof,rdb,仅同步,slave开启rdb,无哨兵,由其他方式进行主从切换,且调用地址通过域名方式指定,slave性能较master稍差,单机24核64G,redis整体内存开销不大,最大仅3G左右,有些甚至就记录几个数字,单机部署16实例),slowlog(由于其他原因无法知道slowlog的阈值)中无慢操作,各环节带宽开销均不大(最大250M),连接池考虑分片及服务端本身负载均衡因此单进程针对每个redis实例配置的数量均不大(100-128),testOnBorrow等均为false。redis机器上每个核cpu使用均不高(大部分为20%以下,有些由于做其他操作最大为70%)
服务端和前面说的一样,cpu使用率仅在350%以下,增加压力并不能提高cpu使用率,反而有衰减趋势(感觉某处资源受限后拖累整体),jvm日志中无full gc。
低负载情况下通过计时日志观察7步redis操作耗时总和基本控制在7ms内,甚至有些会下探到5ms(有个种子生成会进行预载,加载200个后停止,当一旦被使用后再次开始加载。且此处也使用分布式从redis递增获取种子)
检查很久都未发现瓶颈在哪,请问整个环节中有什么遗漏或者会导致性能变化的可能性