目录
一、调优
1、基础概念
**吞吐量:**用户代码执行时间 /(用户代码执行时间 + 垃圾回收时间)
**响应时间:**STW越短,响应时间越好
所谓调优,首先确定,追求啥?吞吐量优先,还是响应时间优先?还是在满足一定的响应时间的情况下,要求达到多大的吞吐量...
吞吐量:科学计算、数据挖掘;吞吐量优先的一般:(PS+PO)
响应时间:网站 GUI API(1.8 G1)
2、什么是调优?
-
根据需求进行JVM规划和预调优
-
优化运行JVM运行环境(慢,卡顿)
-
解决JVM运行过程中出现的各种问题(OOM)
3、调优,从规划开始
调优,从业务场景开始,没有业务场景的调优都是耍流氓
无监控(压力测试,能看到结果),不调优
步骤:
-
熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)
-
响应时间、停顿时间 [CMS G1 ZGC] (需要给用户作响应)
-
吞吐量 = 用户时间 /( 用户时间 + GC时间) [PS]
-
-
选择垃圾回收器组合
-
计算内存需求(经验值 1.5G 16G)
-
选定CPU(越高越好)
-
设定年代大小、升级年龄
-
设定日志参数
-
-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
-
或者每天产生一个日志文件
-
-
观察日志情况
4、调优案例
**案例1:**垂直电商,最高每日百万订单,处理订单系统需要什么样的服务器配置?
1小时360000集中时间段, 100个订单/秒,(找一小时内的高峰期,1000订单/秒)
**计算:**一个订单产生需要多少内存?512K * 1000 500M内存
**案例2:**12306遭遇春节大规模抢票应该如何支撑?
12306应该是中国并发量最大的秒杀网站:号称并发量100W最高
CDN -> LVS -> NGINX -> 业务系统 -> 每台机器1W并发(10K问题) 100台机器
普通电商订单 -> 下单 ->订单系统(IO)减库存 ->等待用户付款
12306的一种可能的模型: 下单 -> 减库存 和 订单(redis kafka) 同时异步进行 ->等付款
减库存最后还会把压力压到一台服务器
可以做分布式本地库存 + 单独服务器做库存均衡
大流量的处理方法:分而治之
**案例3:**有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G 的堆,用户反馈网站比较缓慢,因此公司决定升级,新的服务器为64位,16G 的堆内存,结果用户反馈卡顿十分严重,反而比以前效率更低了
- 为什么原网站慢? 很多用户浏览数据,很多数据load到内存,内存不足,频繁GC,STW长,响应时间变慢
- 为什么会更卡顿? 内存越大,FGC时间越长
- 怎么办? PS -> PN + CMS 或者 G1
**案例4:**系统CPU经常100%,如何调优?(面试)
CPU100%那么一定有线程在占用系统资源,
-
找出哪个进程cpu高(top)
-
该进程中的哪个线程cpu高(top -Hp)
-
导出该线程的堆栈 (jstack)
-
查找哪个方法(栈帧)消耗时间 (jstack)
-
工作线程占比高 | 垃圾回收线程占比高
**案例5:**系统内存飙高,如何查找问题?(面试)
-
导出堆内存 (jmap)
-
分析 (jhat jvisualvm mat jprofiler ... )
**案例6:**如何监控JVM
1.jstat jvisualvm jprofiler arthas top...
再小的努力,乘以365都很明显!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!