前
偶然看到此书的推荐,发现自己也是好久没有静下心去读一本书了。所以,图书馆找到。
自己是比较浅的把书翻了一遍,这里记下一些比较有意思或者有启发的点吧
简介
- 书名:构建高性能Web站点
- 作者:郭欣
- ISBN:9787121170935
改善性能和扩展规模的具体做法
这本书深入浅出,从方方面面的解释,如果去优化一个 Web 站点。从前面的 ab 压测开始介绍,到后面的内容缓存,浏览器缓存,数据库优化,以及反向代理等等。
虽然比较少接触到里面的一些内容,但是通过本书,也是很好的了解了,关于服务器的优化的各个方面,以及可以去优化的地方。
本书的绪论
序列部分,对书的各个章节做了一个引子。抨击了:速度不快就增加带宽的想法
。
数据网络传输
这一章写的比较有意思,因为全是局的各种例子,虽然学了计算机网络,不过,看起来还是收益不小。
- 普通调度站
相当于最早的集线器,所有的数据帧,不经分帧的转发到各个端口,很容易出现数据的碰撞 - 高级调度站
相当于交换机,可以根据路由表的mac把数据包进行精准转发
数据如何发送
这里从内核的角度解释了数据的发送,挺有意思的。
- 先把数据写入进程的内存空间里面去。
- 通过系统调用 send,向内核发起请求,内核进行数据拷贝,从用户空间拷贝到内核空间。而且发送数据以队列形式存在进行缓冲。
- 内核通知网卡控制器来取走数据,网卡控制器把内核网络数据搬运到网卡的缓冲区中。数据赋值都是按照数据的总线宽度的整数倍进行复制。比如 pci-x 的口是32 位宽度。
- 网卡缓冲区的数据被转换位线路中的电信号,并且数据被从缓冲区中清除。
- loop 至此实现网络的数据发送。
服务器的并发
吞吐率 reqs/s
之每秒完成的请求次数,这里就引出了 ab 来进行的压测。
ab -n 1000 -c 10 -H Host:test.example.org http://atom0:8080/
CPU 的大多数的时间都是消耗在 IO 的过程中。当fork() 占用了太多的资源,那么 apache 就使用了 prefork 的模型,实现了提前的fork 不过再大量的并发的时候,内存倒是成了问题。
在 top 命令里面的pr,意味着时间片的长短 一般为 PR*10ms
,系统负载 一般理解为 CPU 的负载状态 0~x 。当系统负载小于1的时候,说明进程正常被调度,大于一,表示会有进程不能及时的得到时间片。
进程分析的时候 strace 适用于进程的调用统计。很好用
IO模型
PIO 与 DMA
PIO 这种传输方式是需要CPU进行控制的,从磁盘读书数据到内存里面是需要通过CPU进行转发的,需要占用大量的CPU时间进行文件的读写。
后来有了 DMA 的方式,(Direct Memory Access)取代了PIO,直接向DMA下达指令,就可以直接通过系统总线进行数据传输。
- 同步阻塞IO
IO的阻塞等等,进程停下来,效率低 - 同步非阻塞 IO
需要轮询检测是否就绪,花费CPU时间 - 多路IO就绪通知
异步回调IO,select/poll/SIGIO/epoll
,水平触发和边缘触发。
SIGIO 是最快的方式,不过属于边缘出发,容易丢失状态
缓存
动态内容缓存
通过 PHP 的插件实现 一些动态结构的缓存
动态脚本加速
指的是对于 PHP 解释器的 OPcode 来进行缓存。
浏览器缓存
通过指定缓存的过期时间达到对内容进行缓存的目的,减少对服务器的请求
Web 服务器缓存
在webserver的配置里启用cache。
反向代理缓存
Ningx 里的反向代理,里对静态资源进行缓存。
分布式缓存
memcached 实现分布式的缓存系统
数据库优化
解决慢查询问题,又是大学问。当查询数据占表的多数时候线性查找是由于索引的
Web负载均衡
- 通过重定向实现,可以使用 RR 的轮询方式,实现轮询的负载均衡。
- 基于 DNS 的负载均衡,可以一个域名指向多条 A 记录。
- DNS 的故障转移,如果TTL过久就不行,所以需要使用 DDNS 实现迅速的故障转移
- 通过 反向代理实现 ,这里面应该是最常用的了。
IP负载均衡
这里在四层进行的负载均衡,需要去重点了解一下了,LVS作为IP负载均衡的各种组态。
- LVS-NAT
这里由网关作为内部子网的 NAT,请求和回源都经过网关主机,导致网关的吞吐量可能成为瓶颈。 - LVS-DR
主机和网关都处于 WAN 上,通过网关进行ip的负载均衡,通过Wan来进行回源,而无需通过网关,这样很大的提升了吞吐量。可以理解,网关和主机都是在一个wan上的,对外使用同一个 VIP ,
内容同步与分发
SSH,SCP,SFTP,rsync。
后
草草的翻过这本书,整体感觉不错,虽然接触较少,但是也是有了基本的印象和认真。
OK,就这样,下一本