面试官:Java 性能调优你会多少?一个问题就把我问的哑口无言,哭了!
一、前言
什么是性能调优?
性能调优其实很好理解,就是优化硬件、操作系统、应用之间的一个充分的协作,最大化的发挥出硬件的极致性能,来应对高负载的业务需求。
为什么需要性能优化?
其实说到底就是两个原因:
①:为了获得更好的系统性能
②:通过性能调优来满足不断增加的业务需求
性能调优其实作用于我们项目中的很多阶段,项目上线前性能的基本优化,项目上线后也是需要持续不断的性能优化来应对不同时期的业务需求。
我有个朋友现在在阿里是 P7,他认为在 P7 这个职位,特别是像阿里这种体量的企业,以下这些性能调优的技术是必须要掌握的,之后给我分享了他自己这么多年精心整理的性能调优笔记。
经允许,现在也是可以分享这份笔记的完整版给大家了,需要的朋友可以帮 LZ 进行转发+关注,加小助手 vx:bjmsb2019 或者 vx:1249448307 即可!
二、六大性能调优技术(JVM 调优+网络调优+数据库调优+LINUX 内核调优+中间件底层探索+容器环境调优)
手绘板(脑图)
1、JVM 调优
JVM 调优必备理论知识-Gc COLLECTOR-三色标记
垃圾回收算法串讲
JVM 常见参数总结
JVM 调优实战
JVM(HotSpot)核心源码解读
JVM 核心模块(GC 算法)手写实战
2、网络调优
TCP 内核参数
JAVA API 参数
IO 模型 TRADE OFF
资源隔离优化
网卡、CPU 配置调优
网络安全的加密算法与数字签名
3、数据库调优
Mysql 性能监控
SCHEMA 与数据类型优化
通过执行计划优化
通过索引进行优化
查询优化
参数优化
分布式 Mysql 优化
SQL 注入、WebShell 攻击的危险和规避方法
4、LINUX 内核调优
单进程最大打开文件数限制
内核内存参数调优
TCP 发送 KEEPALIVE 消息频度
TCP FIN_WAIT_2 状态时间
定义 UDP 和 TCP 链接的本地端口取值范围
优化 TCP 接收缓存的最大值、最小值、默认值
优化内核套接字接收缓存区默认大小
优化内核 TCP 的 SYN 攻击
内存溢出、内存泄漏的原因与解决
如何高效利用 CPU 缓存
内存问题分析与性能优化
磁盘 I/O 性能优化
5、中间件底层探索
Redis6.X 核心源码解读
Redis6.X 内核编码解读
String/Hash/List/Set/ZSet 数据结构解读
Kernel 与 Epoll 多路复用机制底层解读
LRU 算法解读
RocketMQ 源码解读
6、容器环境调优
镜像体积调优
镜像体积最小化
构建速度最快化
使用 CMD VOLUME 指令对 IMAGE 进行服务化
DOCKER 网络方案优化
三、关于性能调优你必须知道的几个点
1、性能指标
我们进行性能优化肯定是为了获得更好的性能,那我们怎么去衡量呢?性能指标又是什么呢?一般衡量一个项目(这里指的是网站)的指标有三个:
吞度量:是单位时间内完成的用户或系统的请求数量。
并发数:同时可以去接收多少用户的访问请求。
响应时间:用户发出请求到收到响应的时间间隔。
2、怎么去进行性能分析?
如果我们通过测试发现网站的性能没有达到我们的预期,我们可以通过什么工具去查找到性能瓶颈呢?
① 硬件
用 vmstat、sar、iostat 检测是否是 CPU 瓶颈
用 free、vmstat 检测是否是内存瓶颈
用 iostat 检测是否是磁盘 I/O 瓶颈
用 netstat 检测是否是网络带宽瓶
② 操作系统
进程
文件系统
SWAP 分区
内核参数调整
③ 应用程序(Mysql 等)
mysqlreport 性能分析报告
mysqlsla 慢查询日志分析
3、根据三大法则进行性能优化
查找出问题之后我们可以通过三大法则去进行调优,首先确定调优目标,其次具体化调优步骤,最后检测调优结果。
4、性能调优就是运维工程师的事?
其实在我看来性能优化是一个团队的事情,为什么这么说,比如我们需要在网上做一个商城,大体的流程应该是这样的:
运营提出需求
产品整理需求
开发开发具体的业务应用
运维搭建开发环境
QA 进行项目测试
运维进行项目上线
监控进行项目监控
这么多部门的参与,可能出现在产品,也可能出现在程序上,也可能是运维的环境搭建的有问题。只是参加性能调优的更多的是开发、运维、测试和监控。
四、总结
其实性能调优没有大家想象的那么难,掌握好正确的思路去实施是完全可以做到的,不管是做程序员这一行业,还是其他任何行业,做一件事情之前,首先都是要去缕清思路、做好计划、进行检查,然后再去实施。
需要的朋友可以帮 LZ 进行转发+关注,加小助手 vx:bjmsb2019 或者 vx:1249448307 即可!
评论