- 调优目的
- 提升效率,用户体验,让用户感觉更“快”
- 节省服务器资源,让老板省钱
- 系统稳定可靠,性能越高应对突发流量能力越强
- 数值目标
- 降低延迟,例如打开一个页面延迟从1000毫秒降低到100毫秒以内
- 提升单位时间吞吐量。TPS(QPS) 200次每秒提升到2000次每秒
- 找到性能阻塞点
- 要坚持“实事求是”的原则,找到系统是哪些地方慢。
- 找到慢的原因
分析日志
查看监控
压力测试
review代码
- 常见性能阻塞点
-
硬件资源
网络、内存、CPU、磁盘 -
操作系统
服务端系统(Linux)
客户端系统(IOS\Andriod\Mac\Windows) -
基础软件
中间件:Jvm、Nginx、Tomcat、Jetty、ZooKeeper、Kafka、RocketMq、Redis等
数据库:Mysql、Oracle、PostgreSQL -
程序代码
内存管理、算法、同步异步、串行并行、线程(池)、锁竞争、IO模型、连接池、压缩后传输、按需获取、SQL性能、逻辑正确、缓存使用 -
系统架构
单机系统
单体应用
全同步
读写混合
负载不均衡
无缓存 -
业务逻辑
分步处理、延迟加载、功能和性能需合理取舍
- 硬件资源改善
- 分布式部署,适当增加节点,扩展连接数
- 增加网络带宽、内存容量、CPU数,提高磁盘读写效率或容量,网卡传输率等
- 操作系统
- 操作系统的选择,Linux优于Windows,IOS优于Android
- 操作系统的配置,例如:关闭GUI、关闭非必要的消耗资源的后台程序等
- 基础软件调优
- 中间件配置参数调优 例如:Jvm参数调优,Tomcat/Jetty线程和队列调优,Kafka副本数和Ack策略,Redis内存大小等
- 数据库配置参数调优
例如:
优化数据库参数最大连接数:max_connetions;
增加线程缓存大小:thread_cache_size;
增量临时表内存大小:temp_table_size和max_heap_temp_size
- 程序代码优化
- 内存优化,按需分配内存,提前释放内存,控制单次操作时消耗过大内存、数据压缩等
- 优化算法,例如敏感词过滤,字符串匹配算法转成DFA(Deterministice Finite Automaton),即有穷状态机
- 异步化、并行化、多线程处理,充分利用机器内核资源,节省执行时间,例如:打印日志时异步处理,并行查询商品库存和评论信息时并行,
但并不是越多线程越好,线程太多做线程切换时是需要消耗资源的。 - 无锁化,或降低锁的粒度
例如:使用ThreadLocal避免加锁,修改概率小的场景使用乐观锁(自旋锁) - IO异步化,长连接代替短连接
例如采用NIO代替BIO,TCP连接代替HTTP连接,减少连接时的资源消耗 - SQL性能优化
例如适当增加索引,查询参数数据类型与数据库一致 - 合理使用缓存,以空间换时间 例如,少量数据使用jvm缓存,大量数据使用分布式缓存,根际具体情况设计各级缓存,客户端、代理层、应用层、数据层都可以使用缓存。
- 逻辑正确
避免死锁、死循环等危险操作
- 系统架构优化
- 分布式系统,集群化
实现横向扩展 - 应用分层,前后端分离
- 异步化设计
例如使用MQ异步化,削峰排队处理 - 数据库读写分离
- 负载均衡
采用有效的负载均衡策略 - 增加缓存设计
- 微服务化,坚持单一职责
- 业务逻辑层面
- 用户重型操作分步化处理
例如,订单提交时选择一个事先填好的收货地址 - 延迟加载无需马上使用的内容
例如,商品页面先只显示一页商品,点击下一页看其他页商品 - 严重影响性能的需求要跟性能做一定折中取舍