服务器如何发送数据?
1. 服务器程序将需要发送的数据写入该程序的内存空间中;
2. 服务器程序通过操作系统的接口向内核发出系统调用;
3. 系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取,此后CPU转而做其他处理;
4. 网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中;
5. 网卡将字节转换成二进制位,再以电信号的形式输出至网络。
什么影响了数据发送的速度(带宽)?
1. 数据的发送速度由接收方的接收速度决定。 (滑动窗口协议)
2. 与传播介质的并行度有关
运营商为什么要限制带宽?
流量控制。
如何选择网站的被测URL?
一个网站的URL可能有很多,每个URL对应的处理也不尽相同,某一个URL的测试结果并不具有代表性。因此,我们需要选择一系列有代表性的URL,将测试结果的加权平均数作为网站的综合性能。
动态内容缓存
浏览器向服务器发送请求后,服务器会根据浏览器的要求做相应的处理(如:数据库操作),然后将处理后的结果注入JSP页面生成HTML,最后将生成的HTML返回给浏览器显示。我们知道,数据库读取操作是非常耗时的,如果能将每次请求中的数据库处理时间去掉,那服务器的相应速度将会大幅提升。
事先生成HTML页面的技术称为动态内容缓存。
什么是 “缓存命中率”?
缓存命中率 = 访问缓存的请求数 / 请求总数
缓存命中率是衡量缓存是否有效的重要指标。如果将所有需要访问的数据均缓存起来,那么缓存命中率是100%。但一般情况下,为了节约存储空间,只将访问频率较高的数据缓存起来,那么这样就会造成有一些请求能够通过缓存访问数据,而有一些请求需要查询数据库访问数据。
我们没有办法确保缓存的命中率为100%,但我们需要使用一些算法确保缓存命中率较高。也只有当缓存命中率较高的情况下,缓存才能发挥它真正的价值。
缓存的三种存储方式
缓存可以存储在三种不同的地方:
1.存储在内存
2.存储在IO设备
3.存储在内存和IO设备上
4.存储在缓存服务器上
静态化页面
1.服务器程序启动的时候将生成所有需要访问的HTML页面,存储至服务器外设中;
2.浏览器所有a 标签中的href都填写这些静态HTML页面URL;
3.在服务器中开启一条定时线程,每隔一段时间检查动态数据发生修改的HTML页面,并生成新的HTML页面;
4.当数据库发生修改时,立即更新与该数据相关的HTML页面。
浏览器缓存
是否启用浏览器缓存是通过HTTP协议控制的。
浏览器在接收服务器传来的页面后,会将页面存入本地缓存。如果响应头中包含了页面的过期时间,那么当用户请求相同的页面时,浏览器会询问服务器是否可以使用缓存页面,若服务器同意使用缓存,则返回 304 状态码,若服务器不同意,则将新的页面返回给浏览器,并携带 200 状态码。
此外,如果响应头中未包含启用浏览器缓存属性的话,浏览器仍然会缓存当前页,但下次请求相同页面时浏览器会直接向服务器请求新的页面,而不会询问是否使用缓存页面。
1.采用Expires属性
Expires属性表示过期时间。
2.采用Cache-Control属性
Cache-Control:max-age = 3600表示页面从当前时间开始3600秒后过期。
浏览器缓存的优点
1.浏览器缓存能够大大降低服务器的网络IO,从而服务器能够租用更廉价的带宽。
2.浏览器缓存能减少(甚至消除)服务器查询缓存的操作、数据库操作,从而减小服务器压力,提高并发数。
反向代理缓存
正向代理:翻墙技术、一台可以连接外面世界的Web服务器。
反向代理:客户端向一个服务器A提交请求后,服务器A偷偷地去服务器B上获取资源,并返回给客户端。
将后端服务器缓存 和 反向代理缓存一起使用
1.反向代理服务器有时会漏掉一些原本需要缓存的数据,后端服务器的缓存能避免用户请求这部分数据时消耗太多时间。
2.反向代理服务器的数据缓存是在用户第一次请求时进行的,而后端服务器的数据缓存是在服务器启动时完成的。
反向代理服务器与后端服务器的网络环境搭建
由于反向代理服务器和后端服务器是通过TCP进行数据通信,因此为了降低他们之间的通信时延,需要将这两台服务器放 在内部网络下,并通过交换机相连。
Web组件分离
什么是Web组件
网站的静态网页HTML、JavaScript脚本、CSS样式、图片、动态数据称为网站的Web组件。也就是说,一个Web应用由各种各样的Web组件构成。
为什么要进行Web组件分离?
一个网站的Web组件往往有各自的特点,比如:HTML页面属于静态文件,当用户请求一个HTML页面的时候Web服务器会进行IO操作,读取HTML文件;而用户请求动态数据的时候IO操作会比较少,但会涉及到大量的CPU计算;因此,如果静态内容和动态内容都使用相同的服务器配置的话显然不能发挥Web应用最好的性能,因此我们需要对不同的Web组件采取不同的服务器配置方案。因此需要组件分离。
如何进行组件分离?
我们可以把不同的组件放在不同的服务器上,并且根据组件的特点,定制服务器配置,从而发挥组件最好的性能。要实现不同组件指向不同的服务器,我们首先需要为网站解析更多的子域名。
域名解析
- static.5188.help #用于存放静态数据
- api.5188.help #存放动态数据
- css.5188.help #存放css
- js.5188.help #存放js
- upload.5188.help #存放图片、音频、文档
构建数据缓冲区
什么是数据缓冲区?数据缓冲区有啥好处?
可以在数据库之前开辟一块内存缓冲区,我们把这块区域称为数据缓冲区。所有从数据库出来和进入的数据都要经过该缓冲区。那么,数据想要进入数据库,首先需要进入缓冲区,当缓冲区存满时,一次性地写入数据库,从而降低了数据库操作的频率;同理。。。。
如何构建数据缓冲区
1.读缓冲:用于存放即将被存入数据库的数据。
2.写缓冲:用于存放最近一段时间访问频率较高的数据。
使用Memcache实现数据缓冲区
负载均衡
HTTP重定向实现负载均衡
DNS负载均衡
动态DNS负载均衡
反向代理负载均衡:粘滞会话(用户session不在同一个后端服务器问题)