网站备案后有可能会被注销吗,wordpress 归类插件,个人做网站的注意事项,wordpress nginx安装一、概述
性能优化的目标#xff1a;是提高系统或应用程序的响应时间、吞吐量、cpu、内存、磁盘IO、网络、流量、JVM、Tomcat、DB等方面的性能指标。
性能优化需要有一些技巧#xff1a;对于整个产品或项目而言#xff0c;比如可以从前端优化、后端优化、架构优化、高并发…一、概述
性能优化的目标是提高系统或应用程序的响应时间、吞吐量、cpu、内存、磁盘IO、网络、流量、JVM、Tomcat、DB等方面的性能指标。
性能优化需要有一些技巧对于整个产品或项目而言比如可以从前端优化、后端优化、架构优化、高并发优化、Linux内核优化、常用中间件优化等方便去优化当然每个方面侧重点不同用的技术点也不同。
当然除了上述从技巧方面做优化我们也必须通过使用性能测试工具进行性能基准测试并根据测试结果进行有针对性的优化。注意的是性能优化需要结合具体的应用场景和问题进行分析和调整避免过度优化和过早优化。
二、技术优化之中间件优化 Easticsearch性能优化包括硬件优化CPU、内存和磁盘空间SSD硬盘可提高性能、合理设置分片数量和副本数量、索引设计选择合适的数据类型避免过度索引字段。合理设置分词器和分析器以便正确地处理文本数据、查询优化使用过滤器而不是查询来提高性能。缓存常用查询结果避免重复计算、合理的master节点数量、清晰的节点职能(master、data、coordinator)、冷热数据分离、JVM调优调整JVM堆大小、垃圾回收器等参数、JDK升级、集群拆分、ES参数优化(refresh_interval、thread_pool、cache、file descriptors、swap)、网络优化、日志管理等。具体的优化策略还需根据实际应用场景和需求进行调整和优化。 Kafka性能优化包括参数优化、合理的分区数量和副本数量、消息生产者优化批量发送消息、异步发送、重试机制等、消息消费者优化调整消费者的并发度、使用多线程消费、增加缓存大小等方式、消息压缩、监控和调优(消息延迟、消费者位移、磁盘使用率等)。 Mysql性能优化包括索引优化、读写分离、分库分表、查询优化、数据库深度分页参数优化、硬件优化等。 Redis性能优化包括合理的数据结构(string、hash、list、set、zset)、合理的持久化存储(RDB、AOF)、合理的参数配置(最大客户端连接数、最大内存使用量等)、设置合理的过期时间、避免大key、合理的回收策略、热key处理、缓存穿透、缓存击穿、缓存雪崩等。
三、技术优化之高并发优化 缓存优化缓存是提高系统性能的重要手段之一可以采用本地缓存、分布式缓存、堆外缓存等技术来提高系统的并发处理能力和响应速度。本地缓存即JVM缓存注意堆内存的合理设置以及防止出现堆内存溢出和堆内存泄露分布式缓存如redis缓存等。注意在选择缓存技术时需要考虑多种因素如数据量、访问频率、数据更新的频率、缓存一致性等同时也需要根据实际情况进行性能测试和优化。 消息队列消息队列是一种异步通信机制可以将任务的执行和结果的返回分离开来从而提高系统的并发处理能力和可靠性。 限流限流是一种重要的高并发优化手段可以有效控制系统的并发访问量保护系统免受过载的影响。比如令牌桶算法、漏桶算法、计数器限流、基于时间窗口的限流、分布式限流(基于redis或zookeeper的分布式令牌桶算法实现的全局的限流控制)、服务网关限流(如阿里的Sentinel)、弹性限流(根据系统实际负载和资源状况动态调整限流策略实现限流的弹性和自适应性)。以上是一些常见的限流策略和技术限流可以有效避免系统因过载而崩溃保障系统的稳定性和可靠性。在实际应用中需要根据系统的特点和需求选择合适的限流策略并进行合理的配置和调优。 熔断是一种用于高并发优化的重要机制它可以提高系统的容错性和稳定性。当系统的某个服务出现故障或不可用时熔断机制会暂时中断对该服务的请求避免将故障传递给其他组件从而保护整个系统的可用性。 降级是一种在高并发环境下优化系统性能和提高可用性的常用策略。通过降低系统的某些功能或服务的负载可以减轻系统压力避免系统崩溃或过载。如服务降级、数据降级、异步处理、限制资源使用、容错处理、负载均衡等。 静态化是一种常见的优化技术可以有效降低系统的负载和提高性能特别适用于高并发场景。静态化的核心思想是将动态生成的内容转化为静态文件并直接返回给用户从而减少服务器的计算和数据库的访问。在高并发方便可以从页面静态化、数据静态化、CDN缓存、静态资源优化等方面优化。需要注意的是静态化对于某些动态内容或频繁变化的数据可能不适用需要根据实际情况进行评估和选择。同时静态化也需要考虑缓存更新、文件同步、页面动态交互等问题以保证系统的稳定性和可用性。 拆分高并发优化中拆分是一种常用的策略可以将系统拆分为多个独立的模块或服务从而提高系统的可扩展性、并行处理能力和容错性。可以从功能拆分、数据库拆分、服务拆分、缓存拆分、请求拆分等几个方面优化。同时在进行拆分优化时需要考虑监控与调优、异常处理与容灾、部署与运维及相应的测试和压测。
四、技术优化之后端优化 jvm优化
1、堆内存调优
2、垃圾回收器选择和调优
3、线程堆栈大小调优
4、调整年轻代和老年代的比例
5、设置Survivor区比例
6、启用GC日志和调试
7、设置最大停顿时间目标
8、启用类数据共享
9、调整大对象直接进入老年代的阈值
10、调整GC日志文件的回滚和大小限制
11、配置线程局部分配缓冲TLAB
12、使用并行垃圾回收器 池化技术池化技术是常用的一种优化方法主要用于减少对象、内存等资源的重复创建和销毁从而提高程序的性能和效率。常见的池化技术包括对象池、线程池、内存池、连接池及文件池等。不过需要注意池大小的配置、内存泄漏的问题和并发访问的竞争等问题。 批量操作批量操作是指一次性处理多个数据或任务的操作。它可以提高程序的效率和性能减少代码的复杂性并且可以避免频繁的单个操作。比如批量增删改、批量文件操作、批量网络请批量数据处理等。需要注意的是合理的批量操作大小、合理的数据结构、合理的异常处理来保证操作的稳定性和可靠性。 异步处理异步处理是一种编程模式通过将任务提交给异步执行的机制可以在任务执行的同时继续执行其他操作提高程序的并发性和响应性。常见的异步处理方式有异步IO操作、异步回调/事件驱动、多线程/多进程异步处理、消息队列等。 并发处理并发处理是指在同一时间段内同时执行多个任务的能力。它可以提高程序的效率和性能充分利用计算资源并减少用户等待时间。可以使用多线程、多进程等。 网络IO优化网络IO是指在计算机网络中进行输入和输出操作的过程。它涉及到数据的发送和接收以及与网络通信相关的操作。常见的操作有数据发送、数据接收。实现方式有同步阻塞IO(BIO)、同步非阻塞IO(NIO)及异步IO(AIO)。可以从减少网络IO次数(比如前面提到的批处理、批请求等方式)、减少网络IO等待时间(异步IO或者多线程并发处理)、优化网络传输效率(比如压缩数据、使用更高效的网络协议或优化带宽等)及优化网络连接管理(复用连接、限制同时连接数量等方式)等方面优化。 锁优化减少锁粒度、使用读写锁、使用无锁结构(CAS)、使用分段锁、避免锁嵌套等。 数据预加载数据预加载策略顾名思义就是提前把部分要用到的数据初始化到缓存。
项目启动执行方法
可以通过实现ApplicationRunner接口中的run方法实现启动时执行。方法执行时项目已经初始化完毕是可以正常提供服务
public class DataInitUtil implements ApplicationRunner{Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println(在项目启动时会执行这个方法中的代码);}
} 使用注解PostConstruct需要在项目执行之前执行一些方法,就在目标方法上添加该注解 存在问题:若执行方法耗时过长会导致项目在方法执行期间无法提供服务。 实现CommandLineRunner接口 然后在run方法里面调用需要调用的方法即可 可以通过java -jar demo.jar arg1传参 实现ApplicationListener接口
Component
public class ApplicationListenerImpl implements ApplicationListenerApplicationStartedEvent {Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {System.out.println(listener);}
}
总结
注解方式PostConstruct 始终最先执行如果监听的是ApplicationStartedEvent 事件则一定会在CommandLineRunner和ApplicationRunner 之前执行;如果监听的是ApplicationReadyEvent 事件则一定会在CommandLineRunner和ApplicationRunner 之后执行;CommandLineRunner和ApplicationRunner 默认是ApplicationRunner先执行如果双方指定了Order 则按照Order的大小顺序执行小的先执行。
10. 时间回调:
如果你调用一个系统B的接口但是它处理业务逻辑耗时需要10s甚至更多。然后你是一直阻塞等待直到系统B的下游接口返回再继续你的下一步操作吗这样显然不合理。我们可以采用事件回调机制即我们不用阻塞等待系统B的接口而是先去做别的操作。等系统B的接口处理完通过事件回调通知我们接口收到通知再进行对应的业务操作即可。如IO多路复用模型实现。
11. 串行改并行
可以使用CompletableFuture 并行调用提高性能类似也可以使用多线程处理。
12. 数据暂存文件
如果接口耗时瓶颈就在数据库插入操作这里用批量操作等策略效果还不理想就可以考虑用文件或者消息队列、redis等暂存。有时候批量数据放到文件会比插入数据库效率更高。该策略的主要思想就是在大数据量时将业务数据写入文件中再通过异步的方式去消费文件中的数据执行对应的业务逻辑减少数据库DB的瞬时压力。
13.避免长事务
长事务在DB服务端的表现是session持续时间长期间可能伴随cpu、内存升高严重者可导致DB服务端整体响应缓慢导致在线应用无法使用所以在线高并发业务中应该尽量避免长事务的发生。产生长事务的原因除了sql本身可能存在问题外和应用层的事务控制逻辑也有很大的关系。
如何避免长事务问题
RPC远程调用不要放到事务里面一些查询相关的操作尽量放到事务之外事务中避免处理太多数据并发场景下尽量避免使用Transactional注解声明式事务粒度太大使用TransactionTemplate的编程式事务灵活控制事务的范围。 五、技术优化之架构优化 技术选型技术选型要从是否满足业务需求、系统稳定性、性能及技术社区的成熟度等方面综合考虑。 空间换时间比如可以采用一些缓存、预计算及冗余等空间换时间的操作。 分布式高并发、高扩展、容错、集群化等手段。 云原生容器化、自动运维、弹性伸缩、微服务等。 微服务可以做到服务单一化、高扩展性且灵活。