面试官:你自我描述里写了有性能调优经验,具体是做了哪些调优?
你:SQL,Java代码,JVM,Docker之类的。
面试官:那你调优的标准是什么?
你:就是看TPS, QPS越大越好,还有最好响应时间不要超过200ms,还有200的接口在高并发的时候出错率要低
面试官:你说的TPS和QPS是什么?
你: TPS就是Transaction Per Second, QPS就是Query Per Second
面试官:TPS和QPS有什么不一样的,都是一个请求嘛。
你:不一样的,一个请求里也可以有多个Transaction,如果一次请求一个Transaction,那可以认为是一样的。
面试官:那你说说你都是怎么解决性能问题的。
你:举个例子,写接口的校验比较多,采用的是抛出异常的方式来返回校验结果,但是异常的捕获,生成异常栈都是很耗资源的,这时候可以在自定义的异常里将writableStackTrace设置为false。
面试官:嗯,那你SQL都是怎么优化的?
你:这个要结合实际情况,比如可以一个查询查出来的,有些人却在循环里单独请求数据库N次,我们减少数据库请求,利用缓存的思想,先把数据查出来,然后在循环里处理数据。
但是复杂的查询,有时候也可以按照需要拆分,不是第一时间需要的,可以懒加载。spring data jpa就有这个坑,hibernate里都是lazy默认的,但spring里却是eager的,一个简单的查询可以牵出一堆不需要的数据。
OneToMany: LAZY ManyToOne: EAGER ManyToMany: LAZY OneToOne: EAGER
面试官:你这个说的还是java逻辑代码的优化,我问的是SQL的优化?
你:哦,首先跑下SQL看看执行计划,看看有没什么索引失效,全表扫描的问题。
面试官:嗯,那你说说java都是怎么优化的?
你:除了上面的异常,逻辑优化,还有就是限制数据量,比如,一个日历拉取的接口,里面的事件有好几千,不可能全返回,而且页面上一天也就显示3个,可以限制到每天三个,点击more再加载当天的,还是一个延迟加载的思路。
面试官:嗯,那你docker是怎么优化的?
你:一般不是docker,是优化docker-compose配置文件,一般就是按权重加减一些service的内存和CPU,分片的数量。
面试官:嗯,那你JVM是怎么优化的?
你:没优化过。。
面试官:你不是在简历上写了吗?
你:就是小调了下,不值一提,调JVM内存大小,jdk8+docker的时候加上参数-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap解决内存限制不起作用的问题。
面试官:还行吧,给你补充几个,你说了CPU,内存,其实还有网络吞吐量和磁盘吞吐量,数据库,计算机系统的负载,进程的,线程的,可以用来判断性能问题。
你:对对对