作者回复: 回答的很全面,赞一个
作者回复: 感谢你的建议。我相信很多同学跟你有一样的想法,那就是赶紧学会使用性能排查工具,性能如何监测分析,如何解决性能问题。
由于不同的性能问题,性能排查以及调优都是不固定的,所以在后面的一些章节中,会有一些结合实际场景来进行性能排查的实战。
在大家了解一些理论性的知识点以及基础之后,也有专门一讲来讲述性能监测工具、调优工具的使用,所以大家保持耐心,切记心急吃不了热豆腐。
在这里我们强调了即使我们性能测试做的再好,兜底策略是一定要做的,兜底也是性能调优的一部分。试想下,我们的性能调优做的再好,系统同样存在极限,当系统达到极限,系统肯定出现性能瓶颈。
在学习成长的过程中,我们切忌将知识点局限于某个层级,或者将自己局限于某一种语言。例如线程池的大小设置,其实也是一种限流的方式,所以限流熔断并不只是局限于架构这块的内容。
我们要做性能调优最重要的目的是什么?在我看来就是为了避免发生线上事故,如果发生线上事故,也是要避免线上大面积事故。所以性能调优做的再好,系统也是存在极限的,兜底策略是系统的保护伞,特别在高并发的系统中,降级/熔断/限流成为保证系统性能稳定性的重要环节。
作者回复: 一个Tomcat进程代表一个JVM
作者回复: 可以通过设置CompileThreshold参数降低执行方法次数阈值来提前预热代码,也可以通过调用WarmUpContextListener.invoke方法指定需要预热的方法,当然也可以在启动时提前写个循环或多线程调用该方法。
我们还可以使用一些工具来预热,例如之前有同学提到的JMH。
编辑回复: 接收成功!谢谢你的建议。
作者回复: 理解的没错,这里用数据冗余来做案例更恰当
作者回复: 如果能用排除法去解决问题,是一个比较好的方式。不过很多线上事故,在线下是无法重现的,这个方式就比较难派上用场了。
作者回复: 你好 建国,欢迎多提问。我先回答你的第一个问题,前面两讲中,一方面,是让你对性能调优有一个全面的认识: 调优的目的是什么,有没有指标可衡量,如何发现性能问题,发现后,我们有什么策略可以调优; 另一方面,我多次强调了基础知识以及调优的思维方式的重要性。所以接下来我将从基础讲起,再到高级篇,学会高性能编程的同时,总结出一惯的调优思维方式。从中很多章节中会有结合实际场景使用到一些测试工具以及性能调优工具。除了这些,我还会在最后用实战的方式来为你讲解实际业务场景下的调优。
从这个专栏的目录来看,没有专题专门讲nginx的调优,nginx如果只是作为转发,由于nginx是基于事件驱动模型实现的web请求转发,使用异步处理方式来避免阻塞,对性能损耗应该不大。如果用lua脚本做了一些逻辑判断,或者限流等等,这个是有损的,会带来很大的损耗。
作者回复: 你好 etdick。
首先,在做性能测试时,我们应该单独部署测试每个微服务的性能,尽量排除服务之间的干扰,先完成单个服务的性能调优;
其次,模拟线上环境下多个服务部署,根据实际业务来模拟多个服务的高峰值的性能测试,如果服务与服务之间存在性能上的互相干扰,且属于不同的业务,我们应该考虑实际生产环境中,两个业务场景是不是存在相同的峰值期,若是,则需考虑分开不同服务器部署或根据需求进行服务降级。
除此之外,我们还可以设置JVM参数来调优各个JVM的内存分配以及垃圾回收。我们知道两个JVM会互相产生影响的主要原因是对CPU的使用情况,而垃圾回收频率是抢占CPU的主要因素。我们可以调优内存分配降低垃圾回收频率,或设置合适的垃圾回收器。由于不同场景具体的分配调优方式不同,我们将会在之后的内容中讲解到。
作者回复: 你好 陆离,你有没有通过命令提前打开JVM内存异常日志呢,可以在启动tomcat时,配置参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/heap/dump,如果遇到内存异常,则会生成dump文件。
504是响应超时,有很多种可能。我建议你先排查应用服务内存是否存在异常,在504时,登录服务器使用top命令查看内存、cpu使用情况,同时查看应用日志是否存在异常日志,排除应用服务的问题;
也有可能是nginx的问题,我们可以查看nginx的日志是否存在异常,如果存在异常,应该调优nginx;
我们可以通过netstat命令查看linux服务器的连接状态,是否存在大量time wait状态的连接。 如果有,需要排除linux服务器的socket最大连接数是否设置合适,太小也容易造成504。
作者回复: 同学你好,你理解的很到位,兜底就是保命,但高于保命,我们不仅仅需要保证系统不挂掉,还要保证流量范围内的请求是正常的。微基准性能测试可以理解为对某块代码进行测试,包括对不同实现方式的性能测试比较。
后面我会在实战中讲到限流、降级的实现和使用,由于这个属于优化的辅助功能,不做具体实现方式的讲解。如果对相关知识感兴趣,可以留言保持沟通。
作者回复: 这位同学,你理解的很好。微基准测试我在这里纠正一点,包括进入抢购页面、提交订单、支付调起,再细一些包括排队等待功能、库存扣减的分布式锁功能、幂等性校验等。
作者回复: 你好 ANYI,建议可以先对一个一个小模块进行性能测试和调优。先对一些代码性问题进行优化,例如之前有同学提到的,合并多次请求,减少多次数据库操作,优化sql(优化join以及索引),优化Java基础代码(集合的合理使用,序列化的优化)等等,先完成这些基础性优化。
在这基础之上,我们再去针对一些业务进行优化,例如业务存在高耦合,我们可以解耦业务,使用一些好的设计方法。通过这种方式逐步了解整个系统的业务以及架构。
代码层级优化之后,我们可以考虑调优JVM、容器以及操作系统,我相信代码层的优化可以满足大部分的性能优化需求,其他的性能调优则是满足一些特殊的场景下的高性能需求。
作者回复: 对的