高性能网站架构方案(二)——优化网站响应时间
高性能网站架构方案(二)——优化网站响应时间
(原创内容,转载请注明来源,谢谢)
一、概述
优化网站响应时间是保证网站受用户关注的要点,主要方案有:
1、减少HTTP请求
当需要加载图片、css、js等内容时,尽量减少加载的次数。可以合并加载,另外当改动量很少时,尽量将内容进行缓存。
图片的缓存可以设定更新时间,定时去服务器查看是否有需要更新的内容。通常可以定时在1周甚至更久的时间。
CSS、JS的缓存,通常可以通过文件名的方式来判断是否需要重新加载。当网页确定需要加载某些js和css时,把文件和已经缓存的文件名进行判断,文件名一致则直接用缓存。因此,可以在文件名中设定版本号,如初始阶段是avatar.1.js,当对此js的内容进行改动后,将html上加载的js文件名改为avatar.2.js,相应的改变服务器上的文件名,强制进行加载。另外,对于可以网页加载完毕后再加载的js,可以将引用的代码放到html标签的最后,保证先将页面展示出来。
2、动态内容静态化
3、优化数据库
数据库的优化是网站优化的最关键的部分。后面专门写。
4、使用负载均衡
可以用DNS轮询、反向代理、HTTP重定向等方式,实现负载均衡,保证每台web服务器接收的请求数量大致相同。
5、使用缓存
使用缓存将改动量大、读取量大等的内容保存在内存中,避免数据库的多次操作,由于内存的读写速度比I/O的速度快得多(数据库存在硬盘中,读写需要经过I/O),则可以节省较多的时间。
二、吞吐率与压力测试
吞吐率是指单位时间内服务器处理的请求数,通常用reqs/s。吞吐率描述运行期间单位时间内处理的请求数,当需要衡量单位时间内可以承受的最大吞吐率,则需要压力测试。
压力测试有许多工具,如LoadRunner、JMeter、ab(Apache Bench)等。
ab是apache附带的压力测试软件。可以通过linux的命令行,直接进行测试,使用方法如下:
ab[options] [http://]hostname[:port]/path
其中,options是可选参数,主要如下:
1)-n:测试会话中执行的请求数,默认是1个
2)-c:要创建的并发用户数,默认1个
3)-t:等待web服务器的最大响应时间,默认没有限制
4)-k:使用keep-alive特性
5)-C:(大写的C)对请求附加一个Cookie,形式为name=value
实例,10个并发用户、1000次请求:
ab -c 10 -n 1000 http://localhost/index.php
其结果会有执行总次数(-n参数)、并发请求数(-c参数)、成功次数、失败次数、总耗时、平均每个请求的耗时(即用户平均等待时间)、平均每秒可以处理的请求数(即吞吐率)。其中,吞吐率是平均每秒处理的请求数,在结果中的参数是Request per second。
三、持久连接
持久连接(Keep-Alive)又称为长连接,是指TCP连接中持续发送多份数据而不断开连接。相应的也有短连接的概念,即每次完成数据发送后就断开连接。
由于客户端和服务器每次建立连接,都需要进行三次握手,需要耗费时间。因此希望进行长连接,改变数据发送后就断开的情况。HTTP1.1开始支持长连接。
HTTP长连接需要浏览器和Web服务器共同完成:浏览器需要保持一个TCP连接不断开,并且不断发送多个请求;服务器不能过早主动关闭连接。
目前大部分浏览器支持长连接,只需要在发出的HTTP请求数据头中包含相关长连接的声明即可:Connection:Keep-Alive,即在发出的header中定义该连接方式即可。
对于服务器,则需要Web服务器的配置中支持长连接,如:
Apache中设置:KeepAliveOn,KeepAliveTimeout 20
Nginx中配置:
http {
keepalive_timeout20; --长连接timeout
keepalive_requests 8192; --每个连接最大请求数
}
长连接对于浏览器和服务器都有默认超时时间,即超过设定的时间如果还没有请求,则断开连接。当双方都设定超时时间,则以较短的一方为最终的超时时间。
当大量请求小文件时,长连接可以显著加快速度。但是,长连接会影响到服务器的并发性能,因此也不是所有情况都设置长连接。
——written by linhxx 2017.08.16
- Robot Framework | 03 基于Public API创建你RFS测试
- Robot Framework | 02 从抛弃RIDE开始创建你的RFS测试
- ASP.NET5 Beta8可用性
- Docker Swarm集群初探
- 数据库逻辑设计
- 06.移动先行之谁主沉浮----我的代码我来写(Xaml的优势)
- [快学Python3]迭代器和生成器
- [快学Python3]INI文件读写
- Vijos P1131 最小公倍数和最大公约数问题【暴力】
- Vjios P1736 铺地毯【暴力,思维】
- Vijos P1116 一元三次方程求解【多解,暴力,二分】
- Python Selenium设计模式-POM
- [快学Python3]HTTP处理 - urllib模块
- Vijos P1786 质因数分解【暴力】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mybatis高级查询(三):分页查询
- 以OpenResty搭建RTB竞价引擎接入层
- 优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
- Linux--nc命令
- Netty之美--I/O模型
- 023.基于IT论坛案例学习Elasticsearch(二):Query高级知识(一)
- 打卡群刷题总结0807——验证二叉搜索树
- 打卡群刷题总结0808——二叉树的层序遍历
- Mybatis高级查询(四):延迟加载
- I/O多路复用器之隐秘的角落
- 打卡群刷题总结0809——二叉树的锯齿形层次遍历
- 简单的ssm整合练手项目:汽车项目
- 在spring-boot中使用pageHelper插件
- 要深入 JavaScript,你需要掌握这 36 个概念
- mybatis-plus实现增删改查