以下分享的都跳过了很多坑,包括redis、tomcat环境配置、机器硬件配置等等问题(与线上保持一致,或者硬件性能减配系数,例如线上:8C16G,压测:4C8G,系数简单相差2倍),直接把挖掘瓶颈的主要思路搬出台面。
创新互联主要从事网站制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务保定,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
全局图预览
通过对某直播观看页面进行高并发压测,在APM(Pinpoint)监控中发现一个有趣的地方:
上图中两个红框中的数据(接近10s),相隔大概30分钟就发生,16:20左右,系统撑不住服务出现异常不可用,怀着好奇的心态,追查方法调用的栈,如下图所示:
该方法耗时多久呢?首先搞清楚Call Tree里面的一些概念:
可见这个sql查询方法耗时14秒多,为什么呢?APM里面已经显示了sql语句,在mysql中执行查询发现执行时间很快,那么问题出在哪里呢?只能继续深挖!
通过对比同样的url,请求响应毫秒级的情况下,发现数据如下图所示:
从redis获取到数据后,并没有再执行sql查询了,通过这个分析,我们决定追踪代码还原真相(不懂代码的测试不是好开发):
可以看到缓存失效之后,直接查询数据库了
从数据分析来看,sql优化的用处不大,并不是返回了大量数据缺少索引,此次可以跳过。
出现场景:当网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。
处理方法:对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。
1、善用监控工具,例如APM,进行链路监控、服务器性能、方法调用顺序观察
2、追踪方法栈和相关日志
3、深入排查代码挖本质
微信公众号:乐少黑板报
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。