性能优化与调优近期面试总结

前面已经整理发布了两篇近期面试的总结题,今天顺便整理第三部分,性能优化与调优篇,后面还有其他主题的面试真题,敬请期待。

性能优化与调优篇

1.一条SQL操作比较慢请问有哪些原因

答:1.首先排查服务自身是否由于ORM框架导致的问题
2.再次排查网络是否通畅,是否存在丢包延迟等情况
3.确定业务服务正常无CPU 飙高或者FGC等情况
4.确定Mysql服务端是否已经满负荷运行
5.确定当时的场景是否存在高并发写入或者读
6.确定sql对应的表数据,sql本身是否存在导致慢的因素,比如数据量大,sql没有索引,查全部数据等

2.类似天猫/12306的网站操作比较慢从哪些方面去排查

答:1.看用户IP在哪个区,排查用户到CDN层的问题
2.看web层与Nginx之间是否有问题
3.有监控的话可以看监控中各个站点的服务是否有问题
4.看单机处理能力,看用户请求的负载是否不同
5.看服务集群是否有挂掉的情况
6.看服务内部是否有慢接口,FGC,CPU load飙高,磁盘吞吐太慢
7.看第三方接口是否有超时&数据库读写是否存在延迟

3.调用链很长,调用接口比较慢怎么优化?如果你的下游接口很慢无法优化?你的上游有时间要求你怎么搞?有什么思路

答:1.可以进行并行查询
2.加缓存&去除循环调用
3.设置合理的超时时间
4.上游有时间要求但是下游比较慢可以要求对方进行优化
5.如果优化不了则对慢接口进行隔离(框架层面,或者通过异步等其他手段)

4.操作Redis哪些情况下会影响性能/Redis的哪些操作或者哪些设计会影响性能

答: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

5.Cpu Load很高你怎么排查

答:
1.通过跳板机或者SSH登录到服务器执行top命令
2.top -P按CPU消耗排序
3.如果有Java进程飙高则有两个排查路线
一是排查是否有FGC,二是通过top -H -p命令找到对应线程信息,看看哪个线程占用CPU比较高
然后看是否有线程在进行运算,比如正则表达式,频繁抛出异常栈等
如果不是的话可能是别的服务进程(shell)在占用cpu资源,比如进行文本查找,文件删除等

6.如果JVM服务正常是2G,突然出现问题发现超过2G你怎么排查

答:这个问题其实问的不是很有水平,因为研究JVM都知道,jvm的堆内存是2g,但是jvm运行时占用的实际内存其实超过2G,这也不能算如果超过
2g是有问题的,那么假设是有问题的,极有可能是因为FGC导致的,可以通过命令排查,当然还有其他情况,比如线上导数据写文件,读文件等,或者
查询数据比较大,虽然没有超过2g,但是由于GC的原因存在,其实也会导致JVM整个实例占用的内存超过2g.

7.造成Cpu Load很高的原因有哪些?

答:由于CPU是程序计算单元,因此涉及到的长时间高频率计算都有可能
这里仅列出笔者遇到的或者了解到的情况
1.FGC
2.程序的死循环
3.正则表达式回溯
4.正常的比较短暂的load飙高

8.如何查询Nginx访问日志中top 前10的IP地址?Linux命令有哪些

答:cat awk sort ,uniq -c , wc -l,head -n
参考:https://blog.csdn.net/gb4215287/article/details/53733933

9.你根据什么将32工作线程->64工作线程来提高单机处理性能的

答:这里的背景是笔者在进行性能优化的时候对单个应用的处理线程数增大处理,但是增大多少其实笔者没有进行准确的压测,所以面对面试官其实是没有把握获得认可的。
所以在性能优化的时候是需要有套路的,笔者的回答是根据线上的单个服务的qps以及峰值进行预估的,但是方法不对,方法应该是先确定单个服务在32工作线程下能撑多少qps,
预计需要满足多少qps,有没有做过压测,哪些接口是高延迟的,哪些不是。不能靠估计靠拍脑子,要有对应的计算评估参数。

10.操作系统的能无限创建线程吗?有什么危险?

答:不能,会造成操作系统内存不够用操作系统会删除其他应用程序的进程,由于操作系统在linux情况下线程其实是进程衍生的,进程也不是无限创建的,
一个进程能创建的线程也是有上限的。这个问题其实是有坑的,搞不清楚线程,进程与操作系统的关系其实回答的效果非常不好。这个就涉及到计算机的基础知识了。

11.讲讲你用到的GC排查工具有哪些?

答:Jstat,jstack,jmap,jmap-live,jmap-dump,jinfo,jps
MAT,ibmMat,VisualVM,Jprofiler,Arthas

12.出现FGC,OOM怎么排查

答:1.首先jvm进程存在的情况下使用jstat -gcutil pid 观察一段时间发生频率,包括各个区使用的情况,有个大概的判断
2.使用命令查找jvm中存在哪些大对象

13.你增大单机的线程处理数量,那会影响操作系统的线程数吗

答:这里严格来说每个进程能创建的线程数是看底层的操作系统的一些相关配置,比如单个线程的占用空间,单个进程能打开的文件句柄数等。
会影响操作系统的线程数,从操作系统层面来看进程和线程是执行任务的基本单元,操作系统是多少位的,运行的内存是多少也是确定的,那么相应的能
创建的总线程数也大概有个范围。

猜你喜欢

转载自blog.csdn.net/u010504064/article/details/104364960