前面已经整理发布了两篇近期面试的总结题,今天顺便整理第三部分,性能优化与调优篇,后面还有其他主题的面试真题,敬请期待。
答:1.首先排查服务自身是否由于ORM框架导致的问题
2.再次排查网络是否通畅,是否存在丢包延迟等情况
3.确定业务服务正常无CPU 飙高或者FGC等情况
4.确定Mysql服务端是否已经满负荷运行
5.确定当时的场景是否存在高并发写入或者读
6.确定sql对应的表数据,sql本身是否存在导致慢的因素,比如数据量大,sql没有索引,查全部数据等
答:1.看用户IP在哪个区,排查用户到CDN层的问题
2.看web层与Nginx之间是否有问题
3.有监控的话可以看监控中各个站点的服务是否有问题
4.看单机处理能力,看用户请求的负载是否不同
5.看服务集群是否有挂掉的情况
6.看服务内部是否有慢接口,FGC,CPU load飙高,磁盘吞吐太慢
7.看第三方接口是否有超时&数据库读写是否存在延迟
答:1.可以进行并行查询
2.加缓存&去除循环调用
3.设置合理的超时时间
4.上游有时间要求但是下游比较慢可以要求对方进行优化
5.如果优化不了则对慢接口进行隔离(框架层面,或者通过异步等其他手段)
答:1.使用big key作为存储,将单个key的值设置的过大(redis string数据格式默认是512M最大)
2.使用keys扫描redis中的key
3.hash,set,zSet的内容存储过多
4.短链接redis(一般使用连接池提高速度)
5.循环调用命令(可以使用pipeline一次交互实现)
6.数据淘汰(大量的key同时失效)
7.redis占用的系统内存达到Linux服务的总内存大小时出现swap换页操作,导致redis服务抖动
相关链接:https://blog.csdn.net/qq_39380192/article/details/100077012
答:
1.通过跳板机或者SSH登录到服务器执行top命令
2.top -P按CPU消耗排序
3.如果有Java进程飙高则有两个排查路线
一是排查是否有FGC,二是通过top -H -p命令找到对应线程信息,看看哪个线程占用CPU比较高
然后看是否有线程在进行运算,比如正则表达式,频繁抛出异常栈等
如果不是的话可能是别的服务进程(shell)在占用cpu资源,比如进行文本查找,文件删除等
答:这个问题其实问的不是很有水平,因为研究JVM都知道,jvm的堆内存是2g,但是jvm运行时占用的实际内存其实超过2G,这也不能算如果超过
2g是有问题的,那么假设是有问题的,极有可能是因为FGC导致的,可以通过命令排查,当然还有其他情况,比如线上导数据写文件,读文件等,或者
查询数据比较大,虽然没有超过2g,但是由于GC的原因存在,其实也会导致JVM整个实例占用的内存超过2g.
答:由于CPU是程序计算单元,因此涉及到的长时间高频率计算都有可能
这里仅列出笔者遇到的或者了解到的情况
1.FGC
2.程序的死循环
3.正则表达式回溯
4.正常的比较短暂的load飙高
答:cat awk sort ,uniq -c , wc -l,head -n
参考:https://blog.csdn.net/gb4215287/article/details/53733933
答:这里的背景是笔者在进行性能优化的时候对单个应用的处理线程数增大处理,但是增大多少其实笔者没有进行准确的压测,所以面对面试官其实是没有把握获得认可的。
所以在性能优化的时候是需要有套路的,笔者的回答是根据线上的单个服务的qps以及峰值进行预估的,但是方法不对,方法应该是先确定单个服务在32工作线程下能撑多少qps,
预计需要满足多少qps,有没有做过压测,哪些接口是高延迟的,哪些不是。不能靠估计靠拍脑子,要有对应的计算评估参数。
答:不能,会造成操作系统内存不够用操作系统会删除其他应用程序的进程,由于操作系统在linux情况下线程其实是进程衍生的,进程也不是无限创建的,
一个进程能创建的线程也是有上限的。这个问题其实是有坑的,搞不清楚线程,进程与操作系统的关系其实回答的效果非常不好。这个就涉及到计算机的基础知识了。
答:Jstat,jstack,jmap,jmap-live,jmap-dump,jinfo,jps
MAT,ibmMat,VisualVM,Jprofiler,Arthas
答:1.首先jvm进程存在的情况下使用jstat -gcutil pid 观察一段时间发生频率,包括各个区使用的情况,有个大概的判断
2.使用命令查找jvm中存在哪些大对象
答:这里严格来说每个进程能创建的线程数是看底层的操作系统的一些相关配置,比如单个线程的占用空间,单个进程能打开的文件句柄数等。
会影响操作系统的线程数,从操作系统层面来看进程和线程是执行任务的基本单元,操作系统是多少位的,运行的内存是多少也是确定的,那么相应的能
创建的总线程数也大概有个范围。