web系统性能常见瓶颈
问题起因 | 引发问题 |
---|---|
静态资源加载缓慢 | 页面响应慢,长时间空白 |
同时在线人数过多 | 1、session数过多单机内存不足 2、数据库连接数不足 |
单请求数据量过大 | 1、单请求导致内存溢出2、 |
创业型web架构:
cache与mq为可选组件,app可集群可单点
业务量发展迅速升级版web架构
线上首先面对的首要挑战
1、静态资源加载缓慢
解决方案:
- 不常改的js,css、图片等放到cdn中,(生效缓慢是修改文件面对的问题)
- 前端代码层面优化,例如图片懒加载,(没明显缺点)
- 文件压缩,例如vue打包压缩产出文件,nginx开启gzip(压缩质量要保证,图片只显示一半问题排查会很挠头)
2、session不足
在线人数过多时每个连接生成一个session将导致session不断增多,内存占用升高,解决办法:
解决方式 | 优点 | 缺点 |
---|---|---|
app多副本 | 部署不同机器分担session压力 | app有状态时候须额外维护,无状态也须考虑哈希一致性 |
session转由cache组件维护 | app与session不再耦合,cache组件技术成熟且丰富 | 额外维护cache组件 |
使用者2种方法或者混合使用,第一种方法可由tomcat内置session方案实现,第二种有Redis、Memcache、
spring-session等解决方案
3、数据库连接数不足
开发时候不进行并发测试将难以发现并发上来后出现的数据库连接数不足的情况,解决方案可依次渐进
- 此时先尝试提升数据库支持连接数,扩大应用的数据库连接池
- 数据库查询慢sql,先尝试代码层面提升事务提交速度,再考虑数据库层面优化
4、单请求导致内存溢出
特殊场景下数据处理量可能占用大量内存,配置不够时可能会导致服务挂掉,例如
- POI操作excel文件时候将占用大量内存,可能会导致资源不足,须整体考虑业务
- sql执行大量加载数据到内存中,须优化代码或整体设计
- 处理事务的代码块中有与sql无关的耗时操作例如读写文件导致长时间不提交事务可能导致事务超时抛异常,并且可能导致长时间占用数据库连接导致连接池耗尽