性能测试和调优思路
2023-08-23 09:01:45 0 举报
AI智能生成
软件系统性能测试调优思路梳理
作者其他创作
大纲/内容
敏捷测试思维
快速反馈:测试人员应该尽早地测试软件,并及时向开发人员反馈测试结果和问题。这有助于在软件开发周期的早期发现和修复问题,避免在后期出现更严重的问题。
持续改进:测试团队应该始终寻求改进测试过程和方法,以提高测试效率和质量。测试人员应该不断学习和尝试新的测试技术和工具,以适应不断变化的项目需求和技术环境。
紧密合作:测试人员和开发人员应该密切合作,共同制定测试计划和测试策略。测试人员应该参与需求分析和设计,以确保软件的可测试性,并提供测试的建议和反馈。
持续集成和持续交付:敏捷测试强调快速反馈和持续改进,因此持续集成和持续交付是敏捷测试的核心实践。
探索性测试:敏捷测试鼓励测试人员进行探索性测试,以挖掘软件中的潜在问题和缺陷
测试策略,测试计划
根据需求制定测试方案
功能测试
UI测试
接口测试
性能压测
是否进行全链路压测
性能测试的指标,需要达到什么目标
安全测试
对测试方案进行合理排期
技术架构、部署
了解被测试系统的技术架构和组件,包括系统的硬件、网络、操作系统、数据库、中间件、应用程序框架等,以便更好地理解系统的运行机制和测试需求。
中间件是指位于操作系统和应用程序之间的软件组件,用于管理和协调应用程序之间的通信和交互
Web服务器:用于处理HTTP请求和响应,主要用于Web应用程序的部署和访问,如Apache、Nginx、IIS等。
应用服务器:用于托管应用程序并提供服务,主要用于支持分布式应用程序的部署和管理,如Tomcat、WebSphere、WebLogic等。
数据库中间件:用于优化和管理数据库访问,主要用于提高数据库性能和可用性,如MySQL Proxy、Oracle Data Integrator等。
消息中间件:用于支持应用程序之间的异步通信,主要用于解耦应用程序之间的依赖关系,如ActiveMQ、RabbitMQ、Kafka等。
缓存中间件:用于提供高速缓存服务,主要用于提高应用程序的性能和可伸缩性,如Redis、Memcached等。
RPC框架:用于支持远程过程调用,主要用于实现分布式应用程序之间的通信,如gRPC、Dubbo等。
API网关:用于管理和路由API请求,主要用于支持微服务架构和API管理,如Kong、API Gateway等。
日志收集和分析:用于收集和分析应用程序日志,主要用于监控应用程序的运行状态和排查问题,如ELK Stack、Logstash等。
redis 缓存原理
消息队列的原理
消息生产者:负责创建并发送消息到消息队列中。
消息队列:负责存储消息,保证消息的可靠传递。
消息消费者:负责从消息队列中获取消息并进行处理。
消费者可以通过订阅特定的主题(topic),从而只接收到自己关心的消息
可测性,健壮性
设计可测性:在软件设计阶段,要考虑系统的可测试性,包括系统架构、接口设计、模块划分等。设计时应尽量避免复杂度、依赖性和歧义,以便更好地测试和验证系统的功能和性能。
自动化测试:自动化测试可以提高测试效率和质量,减少人工测试的工作量和错误率。测试人员应该尽可能地使用自动化测试工具和框架,包括单元测试、集成测试、接口测试、功能测试、性能测试、安全测试等,以便更好地测试和验证系统的功能和性能。
测试环境:测试环境应该尽可能地模拟生产环境,包括硬件、网络、操作系统、数据库、中间件、应用程序框架等。测试人员应该尽早地准备测试环境,并及时更新和维护,以便更好地测试和验证系统的功能和性能。
测试数据:测试数据应该尽可能地覆盖不同的场景和用例,包括正常情况、异常情况、边界情况等。测试人员应该尽可能地准备多样化的测试数据,并进行有效的管理和维护,以便更好地测试和验证系统的功能和性能。
异常处理:系统应该能够优雅地处理异常情况,包括错误提示、异常日志记录、恢复机制等。测试人员应该尽可能地模拟和测试不同的异常情况,并验证系统的异常处理能力和健壮性。
性能优化:系统应该具有良好的性能和可伸缩性,能够处理高并发、大数据、复杂业务场景等。测试人员应该尽可能地测试和验证系统的性能和可伸缩性,提出有效的性能优化建议和措施。
梳理研发流程
持续改进和优化:测试人员应该不断地进行持续改进和优化工作,包括测试方法、工具、流程等方面,以提高测试效率和质量,并为产品的持续发展提供支持。
软件质量模型
软件质量模型是一种用于衡量和评估软件质量的框架或模型,它描述了软件质量的多个维度和特征,可以帮助开发团队和测试团队定义和衡量软件质量。
ISO/IEC 9126:ISO/IEC 9126是一种常用的软件质量模型,它包括六个维度:功能性、可靠性、可用性、效率、可维护性、可移植性,每个维度又包括若干个特征和度量指标。
IEEE 1061:IEEE 1061是一种软件质量评估标准,它包括八个维度:功能性、可靠性、易用性、效率、可维护性、可移植性、可重用性、兼容性,每个维度又包括若干个特征和度量指标。
TMMi:TMMi是一种测试成熟度模型,它包括五个级别:初级、托管、定义、管理、优化,每个级别又包括若干个测试过程和能力要求。
CMMI:CMMI是一种软件过程成熟度模型,它包括五个级别:初级、可管理、定义、量化管理、优化,每个级别又包括若干个过程和能力要求。
针对稳定业务 进行自动化提效
BVT测试
接口自动化测试
测试方法和技术培训
测试分析
分层测试
数据流分析法
状态机分析法
技术培训
建立培训文档体系 iwiki文档平台
维护业务的测试通识
定期技术分享
电商推荐算法
推荐算法原理:测试人员应该了解推荐算法的原理和机制,包括基于协同过滤、基于内容的推荐、基于深度学习的推荐等,以便更好地设计测试用例和评估指标
测试用例设计,需要考虑各种人群画像是否能被精准推送,推荐算法是否有效
测试账号设置对照组,对比不同组用户被推荐的内容是否符合逻辑
A/B测试:将不同的推荐算法分别应用于两个群体,并对比他们的行为和反应。通过分析两个群体的差异,可以确定哪种算法更有效
服务端 集成测试、接口测试、全链路测试、性能、安全
二次开发能力,开源测试工具二次开发、整合、脚本开发能力
高并发
高并发分布式系统性能测试经验
性能压测
Prometheus普罗米修斯
Prometheus是一款开源的监控系统和时间序列数据库,能够帮助测试人员在性能测试中实时监控和分析系统的性能和稳定性
安装和配置Prometheus:测试人员需要在测试环境中安装和配置Prometheus,以便实时监控和分析系统的性能和稳定性。测试人员需要选择合适的Prometheus版本和插件,配置数据源和规则,确保Prometheus能够正确地接收和存储系统性能数据。
集成Prometheus和性能测试工具:测试人员需要将Prometheus和性能测试工具(如JMeter、Gatling等)集成起来,以便实时监控系统的性能和稳定性。测试人员需要使用Prometheus插件(如JMeter Prometheus插件、Gatling Prometheus插件等),配置数据源和规则,以便将性能测试数据实时存储到Prometheus中。
设计合理的监控指标和规则:测试人员需要设计合理的监控指标和规则,以便实时监控和分析系统的性能和稳定性。测试人员需要选择合适的监控指标(如响应时间、吞吐量、错误率等),设计合理的Prometheus规则和查询,以便实时查询和分析系统的性能数据。
使用Prometheus数据可视化工具:测试人员需要使用Prometheus数据可视化工具(如Grafana、Kibana等),以便实时可视化和分析系统的性能和稳定性。测试人员需要配置数据源和仪表盘,设计合理的图表和指标,以便直观地展示系统的性能和稳定性。
设置告警规则和通知方式:测试人员需要设置合理的告警规则和通知方式,以便及时发现和解决系统性能问题。测试人员需要使用Prometheus的告警功能,配置告警规则和通知方式,以便在系统出现性能问题时及时通知相关人员。
核心三指标
单机服务吞吐量(TPS QPS)
服务响应时间
服务响应错误率
资源指标
资源占用率
CPU
内存
磁盘空间
网络
吞吐量持续波动,需要找原因,进行性能调优
全链路压测
链路分析
隔离管控
链路验证
压测管理
压测执行(压力机)
链路监控
压测报告
链路优化(性能调优)
数据隔离
影子表 影子库
数据流量打标 header中做标记
影子topic(消息队列)
影子消费者
压力测试配置
压测指标
发压配置
阶梯式压测
流量回放工具GoReplay
可以捕获现有用户流量,在测试环境进行回放,可以进行负载测试或生产问题重现和分析
原理
抓包:GoReplay使用libpcap库进行数据包抓取,可以在Linux、Windows和MacOS等操作系统上运行。它可以通过网络接口、PCAP文件或stdin等方式抓取数据包,并进行过滤、分流和处理。
存储:GoReplay使用内存映射文件(mmap)方式将抓取的数据包存储到磁盘上,以便后续的回放和分析。这种方式可以避免数据拷贝和内存占用等问题,提高了性能和可靠性。
mmap指的是内存映射文件(Memory-mapped file)技术,是一种特殊的I/O操作方式。它允许一个进程将一个文件或其他对象映射到它的地址空间中,从而可以像访问内存一样访问这个文件或对象
回放:GoReplay使用多线程方式对存储的数据包进行回放,模拟客户端的请求和服务器的响应。它可以根据需要进行过滤、修改和重定向等操作,以便模拟各种场景和测试需求。
基础能力
监听模式 可以监听端口流量(默认http 流量 grpc流量需要安装插件)
转发模式 转发流量到指定环境
重放模式 把流量存入文件 然后进行重放
性能模式 重放模式的基础上 可以调整流量回放的速度 从而达到性能压测的效果
调优思路
数据缓存性能调优(redis)
注意事项
缓存预热
缓存预热是指在系统启动或高峰期之前,提前将热点数据加载到缓存中。
通过预热,可以避免系统启动时大量请求导致缓存穿透和缓存雪崩问题,从而提高系统的性能和稳定性。
缓存雪崩
缓存雪崩是指在缓存中大量的数据同时过期或者缓存节点意外宕机,导致大量请求落到数据库上,从而导致数据库负载过高,甚至崩溃的现象
缓存雪崩是缓存系统中的一种灾难性问题,需要通过多节点部署、缓存失效时间随机化、热点数据异地多副本等方式来避免
缓存击穿
缓存击穿是指某一个缓存失效后,恰好在失效的时间点有大量的请求访问这个缓存,导致大量请求落到数据库上,从而导致数据库负载过高,甚至崩溃的现象
为了避免缓存击穿,可以使用互斥锁、布隆过滤器等方法来解决。
缓存之前再加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回
性能测试中以上场景 会导致系统崩溃
redis性能测试
不同硬件设备,会导致redis性能有很大区别
最常用方式 redis -banchmark -q -n 100000
该命令会在Redis中运行基准测试,并输出测试结果,例如每秒钟可以处理的请求数量、平均响应时间等。这些测试结果可以帮助用户了解Redis的性能瓶颈和优化方向,从而进行系统优化和性能提升。
测试指定操作(场景)的性能
设置10万随机key 连续set 100万次 贴合实际使用
参数说明
redis自己的性能 不代表自己的产品去操作redis也能达到此性能
高并发系统架构
读多 写少 用缓存技术
分布式架构:将系统分解为多个独立的组件,每个组件运行在不同的服务器上,以提高系统的性能和可扩展性。可以使用消息队列、负载均衡、分布式缓存等技术来实现分布式架构。
缓存优化:使用缓存技术来加速系统的响应速度,减轻数据库和应用服务器的负载。可以使用分布式缓存(redis)、本地缓存、CDN(通过将静态资源(例如图片、视频、脚本等)缓存到全球各地的节点上,以提高用户的访问速度和体验)等技术来实现缓存优化。
子主题
异步处理:使用异步处理技术来提高系统的并发处理能力,例如使用消息队列、多线程、协程等技术来实现异步处理。
数据库优化:对数据库进行优化,以提高数据库的性能和可用性。可以使用数据库分库分表、索引优化、读写分离(读写分离是指将数据库的读操作和写操作分离到不同的服务器上,以提高数据库的并发处理能力和可用性)等技术来实现数据库优化。
负载均衡:使用负载均衡技术来分发用户请求,以提高系统的性能和可用性。可以使用硬件负载均衡、软件负载均衡、DNS负载均衡等技术来实现负载均衡。
安全防护:对系统进行安全防护,以防止恶意攻击和数据泄露。可以使用防火墙、反向代理、SSL证书等技术来实现安全防护。
监控和日志:对系统进行监控和日志记录,以及时发现和解决系统故障和异常。可以使用监控工具、日志分析工具、异常监控工具等技术来实现监控和日志记录。
Prometheus 部署到节点上,做性能监控,一般配合数据可视化工具(如Grafana、Kibana等)使用
ELK 日志查询,分布式服务会统一上报到elk上
APM
APM是一种应用程序性能管理技术,常见的APM工具包括New Relic、AppDynamics、Dynatrace等。这些工具可以监控应用程序的性能指标,例如响应时间、吞吐量、错误率等,并提供分析和报告功能
Trace技术或工具
Trace技术或工具可以对应用程序的请求进行跟踪和分析,以了解请求在系统中的流转情况、耗时情况等。常见的Trace技术或工具包括Zipkin、Jaeger等
skywalking
。Skywalking可以提供应用程序的性能指标、调用链跟踪、异常监控、服务依赖分析等功能,帮助用户深入了解应用程序的性能瓶颈和问题,从而进行精细化优化
redis性能调优
Redis内存溢出:由于Redis是内存数据库,如果内存占用超过最大内存限制,就会导致内存溢出,进而导致Redis崩溃。需要通过监控Redis的内存占用和调整Redis最大内存大小等方法来解决。
最大内存限制(maxmemory)
Redis连接数过多:如果Redis的连接数过多,就会导致Redis的性能下降,甚至影响应用程序的稳定性。需要通过调整Redis参数和优化应用程序代码等方法来解决。
连接数限制(maxclients)
并发执行命令数(maxmemory-samples
Redis命令执行时间过长:如果Redis的命令执行时间过长,就会导致Redis的性能下降,影响应用程序的响应时间。需要通过优化Redis命令和数据结构等方法来解决。
慢查询阈值(slowlog-log-slower-than
JVM调优
内存泄漏:JVM中的内存泄漏是一个常见的问题,会导致内存占用不断增加,最终导致JVM崩溃。需要通过分析GC日志和代码,找出内存泄漏的原因,并进行修复。
GC过长:长时间的GC会导致应用程序的性能下降,甚至影响应用程序的稳定性。需要通过调整JVM参数和分析GC日志,优化GC的效率。
线程饥饿:服务端应用程序中,线程饥饿是一个常见的问题,会导致线程池中的线程无法得到充分利用,从而影响应用程序的性能。需要通过调整线程池大小和分析代码,优化线程的使用。
线程饥饿(Thread Starvation)是指线程无法获得足够的资源或优先级低于其他线程,从而无法得到充分的调度和执行,导致线程一直得不到处理的机会,从而影响应用程序的性能和稳定性
信号量(Semaphore):信号量是一种计数器,用于控制对共享资源的访问。通过设置信号量的计数器和等待队列,可以实现对共享资源的互斥访问和防止线程饥饿。
互斥锁(Mutex):互斥锁是一种基本的同步机制,用于保护共享资源。通过设置互斥锁,只允许一个线程访问共享资源,从而避免线程饥饿的问题。
读写锁(ReadWrite Lock):读写锁是一种高级的同步机制,可以同时支持多个线程对共享资源的读访问,但只支持一个线程的写访问。通过合理使用读写锁,可以避免线程饥饿的问题。
条件变量(Condition Variable):条件变量是一种用于线程间通信的同步机制,可以实现线程的阻塞和唤醒。通过合理使用条件变量,可以避免线程饥饿的问题。
无锁算法(Lock-Free Algorithm):无锁算法是一种基于CAS(Compare-and-Swap)原子操作的同步机制,可以避免使用锁带来的线程饥饿和死锁等问题。但是无锁算法的实现难度较大,需要谨慎使用。
合理设置线程池大小,确保线程足够
合理设置线程优先级,确保高优先级的线程任务能够被优先执行
服务端代码性能调优
频繁的数据读写:如果业务代码中频繁地读写数据库、文件等数据源,就会导致性能下降。需要通过缓存技术、异步IO等方法,减少数据读写,提高性能。
循环嵌套和递归调用:如果业务代码中存在循环嵌套和递归调用,就会导致性能下降。需要通过代码优化和重构,减少循环嵌套和递归调用,提高性能。
不必要的计算和操作:如果业务代码中存在不必要的计算和操作,就会导致性能下降。需要通过优化和重构,减少不必要的计算和操作,提高性能。
并发控制:在多线程和多进程程序中,需要进行并发控制,以避免数据竞争和死锁等问题。可以使用锁、信号量、条件变量等方法进行并发控制,从而提高性能和稳定性。
数据结构选择:不同的数据结构具有不同的性能特点,需要根据实际情况和应用程序特点,选择合适的数据结构。例如,对于需要快速查找和插入的数据,可以使用哈希表;对于需要按顺序遍历的数据,可以使用链表等。
内存管理:在服务端应用程序中,需要进行内存管理,避免内存泄漏和内存碎片等问题。可以使用内存池等方法进行内存管理,从而提高性能和稳定性。
网络通信:在服务端应用程序中,网络通信往往是性能瓶颈之一。可以使用异步IO、多路复用等方法,提高网络通信的效率和性能。
数据库设计:在服务端应用程序中,数据库设计往往是性能影响因素之一。可以通过合理的数据库设计、优化查询语句等方法,提高数据库的性能和稳定性。
mysql性能调优
硬件优化:可以通过升级硬件、使用SSD硬盘等方法,优化MySQL的硬件环境,从而提高性能。
查询优化:可以通过优化查询语句、使用索引、避免JOIN操作等方法,优化MySQL的查询性能,从而提高性能。
联表查询 SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
锁优化:可以通过采用更高效的锁机制,如行级锁、读写锁等,避免锁等待,从而提高MySQL的并发性能。
索引优化:可以通过设计合理的索引、使用覆盖索引等方法,优化MySQL的索引性能,从而提高性能。
选择适当的列:需要选择最常用于查询的列,通常是出现在 WHERE 子句或 JOIN 子句中的列,而不是那些很少使用的列。
索引列的顺序:通常将选择性最高的列放在索引列的前面,选择性可以用唯一性来表示,即该列的值越唯一,选择性就越高。这样可以减少索引的扫描范围,提高查询性能。
多列索引和单列索引:多列索引可以包含多个列,可以提高查询的效率,但也会增加索引的存储和维护成本。需要根据实际情况和查询特点,选择使用多列索引还是单列索引。
覆盖索引:覆盖索引是指索引包含所有需要查询的数据,不必再去访问数据表,可以大大提高查询性能。需要选择适当的列和顺序,并使用包含需要查询的所有数据的索引。
索引的长度:索引的长度可以影响索引的存储和维护成本,过长的索引会增加这些成本。需要根据实际情况和索引列的数据类型、长度等因素,选择适当的索引长度。
避免过度索引:过度索引会增加索引的存储和维护成本,并且可能会影响更新和插入操作的性能。需要根据实际情况和查询特点,选择适当的索引,避免过度索引。
nginx集群调优思路
负载均衡不均:如果负载均衡不均,可能会导致一些Nginx节点的负载过高,而其他节点的负载过低。需要调整负载均衡算法、权重等参数,保证负载均衡的均衡性。
网络瓶颈:如果网络带宽不足,可能会导致Nginx节点之间的通信延迟增加,从而影响集群的性能。需要优化网络架构,增加带宽、降低延迟等。
单点故障:如果Nginx集群中存在单点故障,可能会导致整个集群的性能下降甚至瘫痪。需要采用高可用架构、备份节点等方式,避免单点故障。
配置错误:如果Nginx集群的配置存在错误,可能会导致集群性能下降。需要根据实际情况和应用程序特点,选择合适的配置,并进行测试和优化。
缓存大小
连接数
超时时间
测试数据应该具有代表性,包括请求量、请求类型、请求参数等方面。需要根据实际情况和应用程序特点,选择合适的测试数据,并进行充分测试
消息队列性能调优
集群化部署:将消息队列集群化部署,增加集群的可扩展性和可靠性,避免单点故障。
数据持久化:采用持久化存储方式,将消息存储到磁盘上,避免消息丢失和重复,并支持消息的恢复和重试。
消息分片:将消息分片存储,避免单个消息队列的负载过高,增加系统的并发能力和吞吐量。
负载均衡:采用负载均衡算法,将消息分配到不同的队列或者节点上,避免消息堆积和资源瓶颈。
异步处理:采用异步处理方式,将消息的生产和消费分离开来,避免消息处理速度的瓶颈。
确认消息堆积的原因:首先需要确认消息堆积的原因,可能是消费者处理速度慢,也可能是生产者过度生产消息等等。
增加消费者数量:如果消息堆积的原因是消费者处理速度慢,可以增加消费者数量,将消息分配给更多的消费者,从而提高消费速度。
调整消费者的处理能力:如果消费者数量已经足够,但是消费者的处理能力不足,可以尝试调整消费者的处理能力,如优化代码、增加机器配置等。
减少生产者的生产速度:如果消息堆积的原因是生产者过度生产消息,可以尝试减少生产者的生产速度,如减少消息生产频率、增加消息批量大小等。
增加消息队列的容量:如果消息堆积的原因是消息队列的容量不足,可以尝试增加消息队列的容量,从而减少消息堆积的可能性。
消息重试机制:如果消息消费失败,可以尝试采用消息重试机制,将消息重新发送给消费者进行处理,避免消息丢失和堆积。
监控和告警:在消息堆积的情况下,需要及时监控和告警,发现问题并及时处理,避免消息堆积导致系统的崩溃。
监控和调优:采用监控系统,实时监控消息队列的状态、性能等指标,及时发现和解决性能问题,进行调优。
cpu 性能调优
代码优化:对服务的代码进行性能分析和优化,如使用高效的算法、采用异步编程等方式来提高代码的执行效率,减少CPU占用率
硬件升级,采用容器技术,给分布式服务合理分配CPU资源
内存性能调优
优化内存回收机制,垃圾回收
检查代码中是否存在导致内存泄露的代码
升级硬件,扩充内存配置
网络带宽性能调优
优化网络协议:网络协议可能会导致网络占用率过高,可以优化网络协议,如使用压缩算法、使用二进制协议等方式来减少网络占用率。
缓存网络请求结果:如果服务需要频繁进行网络通信,可以缓存网络请求结果,减少不必要的网络请求,从而减少网络占用率。
增加网络带宽:如果服务的网络占用率过高,可能需要考虑增加网络带宽来提高网络的传输速度。
负载均衡:如果服务的负载过重,可以通过增加服务实例数量、负载均衡等方式来分摊服务的负载,从而减少网络占用率。
采用异步编程:采用异步编程可以减少网络请求的阻塞时间,从而提高网络吞吐量,减少网络占用率。
硬件升级:如果服务的网络占用率过高,可能需要考虑对硬件进行升级,如增加网络接口卡数量、增加网络带宽等方式来提高服务器的性能。
CDN--合理存储静态文件,降低单一网路的网络压力
io性能调优
采用异步I/O:采用异步I/O可以减少I/O操作的阻塞时间,从而提高I/O吞吐量,减少I/O占用率。
缓存I/O操作结果:如果服务需要频繁进行I/O操作,可以缓存I/O操作结果,减少不必要的I/O操作,从而减少I/O占用率。
优化磁盘访问:如果服务需要频繁访问磁盘,可以优化磁盘访问效率,如增加磁盘缓存、使用SSD硬盘等方式来提高磁盘访问速度,从而减少I/O占用率。
代码优化:对服务的代码进行性能分析和优化,如使用高效的算法、采用异步编程等方式来减少I/O占用率。
负载均衡:如果服务的负载过重,可以通过增加服务实例数量、负载均衡等方式来分摊服务的负载,从而减少I/O占用率。
硬件升级:如果服务的I/O占用率过高,可能需要考虑对硬件进行升级,如增加磁盘数量、增加磁盘缓存、使用高速磁盘等方式来提高服务器的性能。
常见问题
缓存热key
同时访问同一条缓存数据,导致请求都落到同一个数据分片,造成分片负载过高
超时雪崩
下游服务超时后,导致上游服务不断重试,瞬间多几倍的请求会压垮服务
日志写入过多
日志分级不合理,写入内容过多也会导致性能问题,比如现网打开了debug log
sql语句慢查询
联表查询未做优化,没有合理的索引等
索引是关系数据库中对某⼀列或多个列的值进⾏预排序的数据结构。通过使⽤索引,可以让数据库系统不必扫描整个表,
⽽是直接定位到符合条件的记录,这样就⼤⼤加快了查询速度
⽽是直接定位到符合条件的记录,这样就⼤⼤加快了查询速度
合理的分库分表,表越小查询越快
课堂实例
大促玩法-加入团队接口压测报错:
bug原因:风控事务加团, 并发执行事务插入和更新同一条记录的操作, 造成死锁
解决方案:尝试插入团信息不需要与更新团人数在一个事务内, 两者可独立开, 避免锁升级造成的死锁
bug原因:风控事务加团, 并发执行事务插入和更新同一条记录的操作, 造成死锁
解决方案:尝试插入团信息不需要与更新团人数在一个事务内, 两者可独立开, 避免锁升级造成的死锁
go_xxx服务存在并发性问题,调用SecCheck接口异常:超时和拒绝连接:
bug原因:RPC调用超时设置太短,导致tcp链接异常
解决方案:timeout从100ms调整到500ms,解决问题
bug原因:RPC调用超时设置太短,导致tcp链接异常
解决方案:timeout从100ms调整到500ms,解决问题
播放上报接口每秒钟1000QPS生产消息,KAFKA消息堆积:
bug原因:kafka消费端需要些更新db,消费慢,导致kafka服务端消息堆积
解决方案:使用kafka消费协程池解决,协程池数量Apollo可配置
bug原因:kafka消费端需要些更新db,消费慢,导致kafka服务端消息堆积
解决方案:使用kafka消费协程池解决,协程池数量Apollo可配置
协程池,简单来说就是由多个协程实现的池化技术
连接池是指预先分配一批连接,并将它们放入一个缓冲区中循环使用,形成池化效应
“内存池”和“进程池”都带有“池”字?其实,这两种技术都属于“池化技术”。
它通常是由系统预先分配一批资源并循环利用,达到资源“池化”的目的,以解决高并发下,
由于大量分配资源,导致性能开销过大的问题
它通常是由系统预先分配一批资源并循环利用,达到资源“池化”的目的,以解决高并发下,
由于大量分配资源,导致性能开销过大的问题
性能测试类型
基准测试
负载测试
压力测试
稳定性测试
可扩展测试
高可用测试
容器化技术
Docker是一种容器化技术,它可以将应用程序和它的依赖项打包成一个可移植的容器,以便在不同的环境中运行
Kubernetes(通常简称为K8s)是一个开源的容器编排平台,可以用于自动化部署、扩展和管理容器化应用程序
特点:Kubernetes提供了高可用性、弹性、自动化、可扩展和可移植等特点。Kubernetes可以自动处理容器的部署、扩展、负载均衡、容错处理、自动化升级和滚动回滚等操作,可以减少运维成本和提高应用程序的可靠性。
组件:Kubernetes由多个组件组成,包括Master节点和Worker节点。Master节点包括API Server、Scheduler、Controller Manager和etcd等组件,用于管理和控制集群的状态和配置。Worker节点包括kubelet、kube-proxy和容器运行时等组件,用于运行和管理容器。
资源对象:Kubernetes将应用程序抽象为一组资源对象,包括Pod、Service、Deployment、StatefulSet、ConfigMap、Secret和Volume等。通过这些资源对象,可以定义应用程序的部署、扩展、负载均衡、容错处理和自动化升级等操作。
Pod:Pod是Kubernetes中最小的可部署对象,它是一个或多个容器的集合,这些容器都共享同一个网络命名空间和存储卷。Pod提供了一个抽象层,用于封装应用程序的部署、运行和管理。
Service:Service是一组逻辑上相关的Pod的访问方式,它提供了稳定的IP地址和端口号,以便其他应用程序可以访问这组Pod。Service还提供了负载均衡功能,可以将请求分发到多个Pod中。
Deployment:Deployment是一种控制器,用于管理Pod的多个副本的创建、更新和删除。Deployment可以根据应用程序的期望状态,自动调整Pod的副本数,并通过滚动更新和回滚策略实现无宕机更新。
StatefulSet:StatefulSet是一种控制器,用于管理有状态应用程序的多个Pod的创建、更新和删除。StatefulSet为每个Pod分配一个唯一的标识符和稳定的网络标识符,以便在Pod重新启动时保持持久化数据的一致性。
ConfigMap:ConfigMap是一种用于存储应用程序配置数据的资源对象,它可以存储键值对、属性文件或者JSON格式的数据。ConfigMap可以通过卷或者环境变量的方式被挂载到Pod中,以便应用程序可以读取这些配置数据。
Secret:Secret是一种用于存储敏感数据(例如密码、证书等)的资源对象,它可以存储base64编码的数据或者加密的数据。Secret可以通过卷或者环境变量的方式被挂载到Pod中,以便应用程序可以读取这些敏感数据
扩展和自定义:Kubernetes提供了丰富的扩展和自定义功能,包括自定义资源对象、自定义控制器、自定义插件和自定义API等。可以通过这些扩展和自定义功能,满足不同的应用程序需求和业务场景。
有状态工作负载
有状态工作负载指的是需要在运行时保持持久状态数据的应用程序工作负载。与无状态工作负载不同,有状态工作负载需要在运行时保存和共享状态数据,例如数据库、缓存、消息队列等。这些状态数据通常需要在应用程序中进行读写操作,而且需要在多个实例之间进行同步和共享
Dubbo和Spring Cloud
都是开源的分布式微服务框架,用于构建分布式系统,提供了分布式服务治理的解决方案。它们都可以用于构建高性能、高可用、可扩展的分布式系统,但是它们有一些不同之处
Dubbo是阿里巴巴开源的分布式服务框架,提供了服务治理、负载均衡、容错、服务注册和发现等功能。Dubbo的核心理念是“面向接口编程”,通过提供接口和实现类的方式,使得服务提供者和消费者可以解耦,从而实现松耦合的分布式系统
Spring Cloud是Spring官方提供的分布式微服务框架,提供了服务注册和发现、配置管理、负载均衡、断路器等功能。Spring Cloud的核心理念是“Spring风格的微服务架构”,通过使用Spring框架的组件和技术,使得开发者可以快速构建分布式系统
Dubbo和Spring Cloud更侧重于微服务的服务治理和开发体验,适合于构建中小型分布式微服务应用,而Kubernetes更侧重于容器化应用的部署和管理,适合于构建大规模容器化应用。
熟悉DevOps相关技术
测试人员需要掌握持续集成、持续交付、自动化测试、日志和监控、容器化技术等与DevOps相关的技术,并将其应用到测试工作中,以提高软件交付速度和质量,实现DevOps的理念和目标。
持续集成(Continuous Integration,CI):持续集成是一种将代码频繁地集成到主干代码库中的开发实践,以确保代码的稳定性和质量。测试人员需要了解CI的概念和原理,以及如何使用CI工具(如Jenkins、GitLab CI等)来实现自动化构建、测试和部署。
持续交付(Continuous Delivery,CD):持续交付是一种将软件持续交付到生产环境的开发实践,以确保软件交付的可靠性和可重复性。测试人员需要了解CD的概念和原理,以及如何使用CD工具(如Docker、Kubernetes等)来实现自动化部署和运维。
自动化测试:自动化测试是一种通过编写脚本和使用测试工具来实现自动化测试的开发实践。测试人员需要了解自动化测试的概念和原理,以及如何使用自动化测试工具(如Selenium、Appium等)来实现自动化测试。
日志和监控:日志和监控是DevOps中非常重要的技术,可以帮助测试人员及时发现和解决软件问题。测试人员需要了解日志和监控的概念和原理,以及如何使用日志和监控工具(如ELK、Prometheus等)来实现日志记录、错误追踪和性能监控等功能。
容器化技术:容器化技术是一种将应用程序打包到容器中,以实现快速部署和跨平台运行的技术。测试人员需要了解容器化技术的概念和原理,以及如何使用容器化工具(如Docker)来实现应用程序的容器化部署和运维。
0 条评论
下一页