性能优化的重要性
性能是网站的一个重要指标,除非没得选择(必须到12306上买票,现在好像有所改变【此处并非是技术问题,解决方案改变业务进行分流,即不同时间放票】),否则用户无法忍受一个响应缓慢的网站,这将导致严重的用户流失。
提升系统的健壮性&可靠性使程序可以适应正常和非正常的运行环境,并且都可以正确地运行;随着业务量的增加,不会出现阻塞和不可用的情况。
提高响应时间,增强用户体验。
性能指标
- 响应时间
响应时间的绝对值并不能直接反映软件的性能的高低,软件性能的高低实际上取决于用户对该响应时间的接受程度。游戏(LOL)和工具软件(PhotoShop) 一秒时间来说,游戏感觉卡,软件感觉还可以介绍。 - 吞吐量
吞吐量是指系统在单位时间内处理请求的数量。例:TPS(每秒处理的事务数),HPS(每秒可以处理的HTTP请求),QPS(每秒处理的查询数) - 并发用户数
并发用户数是指系统可以同时承载的正常
使用系统功能的用户的数量。 - 资源利用率
资源利用率反映的是在一段时间内资源平均被占用的情况。
前端优化方法(JSP)
- 减少http请求
http是无状态的应用层协议,意味着每次请求都需要建立通讯链路、进行数据传输,在服务层有单独线程处理,这些都是昂贵的资源 。 - 启用压缩
在服务端对文件进行压缩,浏览器端进行解压,可以减少文件传输。
- 启用缓存
CSS,JS,LOGO等资源更新频率较低,但几乎每次http都需要请求,使用缓存可以提高性能。 - 合理布局
浏览器会在下载完全部CSS进行页面渲染,因此CSS放置在页面最上面,让浏览器尽快下载CSS,而JS相反,加载到JS立马执行,会阻塞页面渲染,所以JS放置页面最下面(不适合渲染中用到JS的情况)。 - 减少Cookie传输
1.Cookie包含在每次的请求和响应中,太大的Cookie会严重影响数据传输,因此写Cookie要慎重,减少Cookie的传输。
2.对静态资源的访问,如CSS,JS等,发送Cookie无意义,可以考虑使用独立域名,动静分离,减少Cookie传输。 - CDN加速
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
后端优化方法
- 分布式缓存
网站性能优化第一定律:优先考虑使用缓存优化性能。 - 异步操作
消息队列调用异步化,可改善网站扩展性和性能。 - 使用集群
负载均衡构建集群,分散访问压力,减少响应延迟。 - 代码优化
最简单最难的优化手段。简单,我们每个人可以直接操作。最难,需要有较高的理论及实践 。
缓存
- 原理及优势
将数据存储在较高访问速度的存储媒介中。1.减少数据访问时间;2.减少数据计算时间。 - 本质是内存Hash表,时间复杂度为O(1)。
- 存储读写比高、变化少的数据
遵循二八定律 80%用户访问20%数据,缓存20%数据,改善系统性能。
消息队列
- 请求写入消息队列服务器,由消息消费者获取数据,异步写入数据库,达到削峰作用(削平高峰期的并非事务)。
多线程
- CPU计算型任务:最多不超过CPU内核数。
- IO磁盘等待型任务:启用多线程有助于最大使用cpu资源。
垃圾回收JVM调整
- 使用jconsole等工具来查看堆【新生代老年代】栈使用情况,调整jvm参数获取更多内存资源。
资源复用
- 单例模式和对象池
合理使用缓存
- 频繁修改:读写比大于2:1才有意义,一次缓存两次以上读取。
- 非热点:要遵循二八定律。
- 数据脏幻读:缓存有失效时间,需要容忍一定时间的数据不一致。
- 缓存可用性:缓存丢失或不可用不影响系统正常运行。
- 缓存预热:缓存系统启动时加载热点数据。
- 缓存穿透:持续高并发的访问某个不存在的数据,由于未缓存此数据,所有压力落到DB,可能会引起崩溃。解决方法:存缓存value为null。
数据库优化
在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。
MySQL三范式
- 1NF:字段不可分;
2NF:有主键,非主键字段依赖主键;
3NF:非主键字段不能相互依赖;
解释:
1NF:原子性 字段不可再分,否则就不是关系数据库;
2NF:唯一性 一个表只说明一个事物;
3NF:每列都与主键有直接关系,不存在传递依赖(关联表的使用);
优化规则粗略记录
- 1.合适的数据类型:最基本的优化之一就是使表在磁盘上占据的空间尽可能小。这能带来性能非常大的提升,因为数据小,磁盘读入较快,并且在查询过程中表内容被处理所占用的内存更少。同时,在更小的列上建索引,索引也会占用更少的资源。
2.声明列为not null。
3.索引使用:在Unique列上定义Unique index等。
4.使用explan:分析您的SQL语句
5.查询啥取啥,不要用*,减少cpu和网络开销
6.避免数据库频繁连接【druid的监控】
7.避免使用存储过程,定时器等【其他方法解决】
8.优化语句使用缓存,now()等函数不使用缓存。
9.返回结果集少的条件放到右边等等
配置修改
- innodb_buffer_pool_size=80%
这个参数主要缓存innodb表的索引,数据,插入数据时的缓冲,设置得越大,存取表里面数据时所需要的磁盘I/O越少,专用服务器默认70--80%; - innodb_thread_concurrency
线程并发数,建议设置为CPU内核数*2;
修改配置缩小连接死亡时间减少休眠的线程等等; - 配置慢查询参数,抽出慢SQL进行优化;
MySQL表空间碎片整理; - 开启冷热备份,放置数据库的崩溃造成数据丢失,容灾机制;
在热备份基础上使用读写分离;
《大型网站技术架构:核心原理与案例分析》