一、概述
上篇说到如果SQL本身解决不了了,就要上升到表结构,业务代码、架构层面。
- 表结构(冗余、拆分、not null等)
- 业务层代码的优化(减少IO调用)
- 架构优化(缓存、主从集群读写分离、分库分表)
二、如何定位性能瓶颈
CPU 、 磁盘IO、 网络IO、内存 [监控系统]
参考:
jvm问题排查
jvm性能优化
mysql性能优化
三:执行调优策略
性能调优的目标, 在不影响程序正确性的情况下,去提高程序的运行效率。
局部视角
- 池化技术(对象池、内存池、连接池)
- 锁优化(无锁化设计 或者 降低锁的粒度、分布式锁)
- 预处理(cpu的缓存行 、 mysql -Page Cache 预读取机制(Buffer Pool))
- 批处理(减少网络包的传输次数)
- JVM 、参数调优
- Mysql 、 参数调优
- Tomcat 、 参数调优
Tomcat:
- 连接数量(socket.accept)
- 如何在应用层面去支撑更多的链接数量(NIO机制)
- 线程池
- 异步编程想
总结:
业务逻辑的处理本质上就是IO *** 作;
- 查询数据库(磁盘IO)
- 数据库层面的基本优化(Mysql )
- 减少查询数据库的次数(缓存的使用(多级缓存))
- 访问磁盘(磁盘IO)
- 文本的解析和存储
- 磁盘的页缓存(同步、异步刷盘 )
- 顺序读写
- 零拷贝(mmap、sendfile)
- SSD(固态)- HDD (机械磁盘)
- 减少访问磁盘的场景(缓存的使用(多级缓存))
- 异步化(最有效的武器)
- 网络通信(远程通信、网络IO)
- 池化技术(一次性创建多个连接)
- 长连接
- 长轮询
- 异步回调
- 同网段通信
- 批处理(减少网络包的传输次数)
- 数据压缩(减少网络包传输的大小) -> 序列化算法 protobuf
- 减少网络通信的场景(缓存的使用(多级缓存))
- 内存运算(内存IO)
- 内存缓存
- 异步化设计
- 线程的设计(多线程)
- MQ的使用
- 使用合适的数据结构算法(数组、链表、树、图、栈、Hash表、跳跃表不同的数据结构涉及到不同时间复杂度)
- 最后JVM优化
宏观视角
- 硬件资源
- 垂直扩容
- 水平扩容
- 软件架构
- 异步化架构
- 分布式微服务(负载均衡、熔断限流、多级缓存等)
- 集群架构
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)