热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分析并优化单次查询很快但是高并发时变慢的接口

目录摘要1、性能测试1.1、POSTMAN50次逐条查询1.2、Jmeter50并发查询1.3、Jmeter100并发查询2、数据库慢查询监控2.1、SQL执行计划分

目录

摘要

1、性能测试

1.1、POSTMAN 50次逐条查询

1.2、Jmeter 50 并发查询

1.3、Jmeter 100 并发查询

2、数据库慢查询监控

2.1、SQL执行计划分析

2.2、单次SQL执行时间

2.3、并发情况下SQL执行时间

3、Navicat Monitor  监控

3.1、总体监控

3.2、告警监控

4、优化

4.1、设置连接数

4.2、缓存配置

4.3、最大允许的数据包

4.4、修改配置

4.5、其他优化

5、缓存优化

6、程序优化

7 并发查询

8、性能测试

6、总结


 

摘要

系统中出现了很多,单次查询很快,但是并发量一高就变慢的接口。下面根据具体情况,进行分析并解决相关性能问题。优化的点主要就是 数据库、缓存、接口逻辑、并发设计等。

1、性能测试


1.1、POSTMAN 50次逐条查询

逐条执行的时候,响应时间基本都是一致的,且比较快。

 

 

1.2、Jmeter 并发查询

在并发测试的时候,数据库并发连接数增加以后,查询的响应时间,明显增加很多。

50并发

Samples

吞吐量Throughput

最小响应时间

最大响应时间

平均响应时间

错误率

50

3.3/sec

5188ms

14379ms

10504ms

0%

100并发

Samples

吞吐量Throughput

最小响应时间

最大响应时间

平均响应时间

错误率

100

3.3/sec

6421ms

29513ms

18282ms

0%

zipkin调用链拿到调用信息,最好能拿到接口的调用详情,可辅助分析性能问题

 

 

 

2、数据库慢查询监控

最终还是要回归到数据库上,对SQL进行分析。

2.1、SQL执行计划分析

已经使用了索引,说明SQL本身的效率应该是可以的

 

2.2、单次SQL执行时间

执行时间只有200ms

 

2.3、并发情况下SQL执行时间

高并发时,SQL执行时间都在6S左右,效率比较低

 

借助监控工具可以有效的分析数据库的性能瓶颈,也可通过其他的监控工具,比如monyog,Innotop等。通过上面的分析,可以断定部分问题应该还是出在数据库上。

3.1、总体监控

首先分别在5:48,5.50,5.54 做了三次压测。然后截取监控图片如下,应该不是内存和CPU资源不足的问题,再看数据库的总连接数,明显小于已记录的最大并发连接数量。

 

 

3.2、告警监控

重点分析严重的告警,其中两个跟数据库的连接数有关。

 

当前服务器上的打开连接

每秒全表扫描

 

最大并发连接数量

 

InnoDB 写入缓冲区效率

 

查询缓存命中率

 

最大允许的数据包

4、优化

简单查看系统用户线程数和 系统支持的最大线程数。(一般都没有问题)

4.1、设置连接数

#如果用户线程的并发数小于64,可以将这个参数设为0,如果系统并发很严重,可以先将这个参数设为128,或者更大。但是运行一段时间,看下系统负载,如果负载过高,就调低这个参数,如果负载很低,也可以调高点。
innodb_thread_concurrency=128# 如果客户端尝试连接的错误数量超过这个参数设置的值,则服务器不再接受新的客户端连接。可以通过清空主机的缓存来解除服务器的这种阻止新连接的状态,通过FLUSH HOSTS或mysqladmin flush-hosts命令来清空缓存。
max_connect_errors = 30000# 设置客户端的并发连接数量
max_connections = 2000# 设置客户端的并发连接数量
max_user_connections = 2000

4.2、缓存配置

# mysql服务缓存以重用的线程数
thread_cache_size = 120# 为查询结果所分配的缓存
query_cache_size = 256M#当这个参数为1或ON时,则MySQL服务器会缓存所有查询结果(除了带有SELECT SQL_NO_CACHE的语句)
query_cache_type = 1

4.3、最大允许的数据包

考虑下网络带宽,有的企业内网可能就是100M,所以设置成50M,一般就足够了。

max_allowed_packet = 50M

4.4、修改配置

修改mysql以上配置,并重启数据库

4.5、其他优化

对于全表扫描的情况,说明还有很多额外的SQL 没有使用索引。要逐一优化。主要是给表都加上合适的索引,同时还要分析表模式设计是不是有问题,必要时可以添加一些冗余字段(主要是枚举值的字段或者不会修改的字段),尽量避免多表关联的情况。

优化方式见:https://blog.csdn.net/weixin_41715077/article/details/100938141

5、缓存优化

数据库的问题解决了,其他问题应该还是出在应用程序的设计上。最好借助监控工具分析下,可以借助zipkin或者skywalking等分布式调用链监控工具分析响应最慢的一些接口。

在zipkin查找:
http.path=/plan/api/alarm/history
 
很多其他接口需要这个三个接口的提供基础数据,于是将查询结果全部放到redis中。
/iir/manager/device/list-all
/visible/api/visible-equipment/list-all
/iir/manager/device-handle/all/list

6、程序优化

在zipkin查找:
http.path= device/api/monitor/device-list
 

发现For 循环频繁调用设备服务的接口。
http.method GET
http.path /device/api/device-monitor/type
mvc.controller.class DeviceMonitorServiceImpl
mvc.controller.method getMonitorDeviceType
Client Address 10.0.10.210:46850,

将for循环中查询接口 修改成批量查询接口,在for循环外层调用一次,然后在内层组织数据。

7、 并发查询

优化过程发现,一些代码在for循环中逐条调用图片接口拉取图片,而这个图片接口是通过ceph 的网关拉取图片的,没办法像数据库一样改成批量查询,这里 Cellection.parallelStream()并发拉取图片,提高效率。

8、性能测试

找其中一个接口测试下调优后的性能。

50并发

200并发


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
author-avatar
仔仔衰才_887
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有