问题产生
最近碰到一个被问两次的面试题, 回答并不好特此记录一下。
面试官问, 如果一个后端接口慢, 我们该如何尝试优化?
分析问题
碰到这个问题,很自然代入到自己如何尝试优化:
- 登录服务器或日志系统,根据日志记录找到耗时较多的代码块
- 根据该部分代码块,看是否存在优化空间,绝大部分这段代码是进行读写数据等IO操作
- 根据对应的数据库操作,优化SQL语句,该加索引加索引,该批处理就批处理
- 看上一步是否存在缓存空间,把能够缓存化的读IO操作缓存起来
- 梳理整体的逻辑流程,看是否存在优化空间
这是第一次回答的答案,显然结果并不理想,面试官的反馈也是,你只答出了一个点,且有瑕疵,还有很多要考虑的点没回答。
事后自己仔细思索,并上网查相关问题,发现确实漏了挺多点, 那么再次回答就该更全面:
回答问题
碰到接口慢,要考虑很多点:
- 常见的程序IO操作,如数据库读写, 这块优化索引、缓存
- 如果以上解决, 就要看Tomcat的JVM内存分配是否合理,查看gc日志
- 如果JVM不是瓶颈,那么服务器的配置是否跟不上了,要不要扩容
- 如果以上解决, 作为网络代理的nginx是否配置合理,要不要调整连接数和缓存区
回答以上几块,算是稍微全面了些。但是,每个点都能展开说很多,这就要看平时的功底了,我们简单展开几个:
数据库
- 数据库索引起到什么作用,为何加索引就快?索引越多越好吗?
- 数据库读写存在的事务隔离有哪些,有什么区别?
- 数据库的锁机制有哪些
JVM
- GC日志怎么看,如何判断JVM分区是否合理?
- JVM内存分区有哪些?分别有什么作用
- 了解JDK17的新增JVM吗,和默认的有什么区别?如何选择?
服务器配置
- 如何查看服务器的负载是否合理
- 如果要加配置的话,如何平稳的服务升级?
- 碰到过服务器宕机吗? 如何解决的
nginx
- 负载均衡策略有哪些,如何配置?如何选择?
- 如何优化nginx提升性能?
- worker 和 connections 是什么?要怎么配置更合理
更多个更细的问题
然而回答上面的问题,依然能能够深入更多的细节,这些细节并不是死记硬背就能回答的,更重要的是自己是否理解,是否能想出有逻辑的思路,想出思路的前提,是掌握了该领域的基本概念和最佳实践原理,基于此推理出来的。
功夫在平时
所以,更重要的是平时下功夫, 功夫花在打基础和理解原理上。
用费曼学习法来检测自己, 你能够用普通人都能理解的话讲出来,证明你真正理解了。