构建高性能Web站点 学习笔记

第二章 数据的网络传输

数据是如何发送
1.应用程序首先得将要发送的数据写入该进程的内存地址空间。通常程序开发中变量赋值。
2.应用程序通过系统函数接口(比如SEND 函数) 向内核发出系统调用,由系统内核来进行随后的操作。它将这些数据从用户态内存复制到由内核维护的一段称为内核缓冲区的内
存地址空间。这块地址空间大小通常是有限的。所有要发送的数据将以队列的形式进入这里。这些数据可能来自于多个进程。每块数据都有一定的额外记号来标记它们的去向
如果要发送的数据比较多。那么该系统调用需要多次进行。每次复制一定的数据大小。这个大小取决于网络数据包的大小以及内核缓冲区的承载能力。重复的系统调用体现在
应用编程层面重复调用SEND函数。
3.当数据写入内核缓冲区。内核会通知网卡控制器前来取数据,同时CPU转而处理其他进程。网卡控制器接到通知后。便根据网卡驱动信息得知对应内核缓冲区的地址将要发送的数据
复制到网卡缓冲区中。注意在以上一系列的数据复制中。数据始终连接两端设备的总线宽度复制。也就是字节的整数倍。
4.网卡缓冲区中的数据需要发送的到线路中,同时释放缓冲区来获取更多要发送的数据。
5.发送时,网卡会使用内部特定的物理装置来生成可以传播的各种信号,比如在使用铜线线路中,网卡会使用根据“0”和“1”的变化产生不同的电信号。而使用光纤线路时
网卡会产生不同的光信号

铜线中电信号的传播速度大约为2.3 × 10 ^8,光纤中光信号的传播速度大约为 2.0 × 10^8

我们所讲的带宽的指数据在发送速度。比如百兆网卡便是指网卡的最大发送速度为100Mbps.就是网卡在1秒最多可以发出100Mb的数据。

信号的接收能力至关重要,如果接收能力跟不上,发送能力不可能提高

数据链路层对于数据帧传输控制完全是按照接收方的接收能力来确定发送速度的。

光纤中光的传导损耗比电在电缆传导的损耗低的多。

响应时间 = 发送时间 + 传播时间 + 处理时间

下载进程一般要将接收的数据即时写入磁盘,才会进行下一次的接收数据的系统调用。而写入磁盘的过程需要经历位于内核态内存中磁盘高速缓冲区的转发。



第三章 服务器并发处理能力

压力的描述一般包括两部份即并发用户数和总请求数。

吞吐率前提包括:并发用户数,总请求数,请求资源描述。

最大并发数与请求性质有关

压力测试软件 apache 附带ab ,loadRunner,jmeter

现代计算机的DMA技术可让CPU不参与I/O操作全过程。比如进程通过系统调用,使得CPU向网卡或者磁盘等I/O设备送出指令。然后进程挂起,释放CPU资源,等待I/O设备
完成工作后能过中断来通知进程重新就绪。

进程的高度由内核来进行

每个进程都有自己独立的内存地址空间和生命周期。当子进程被父进程创建后,便将父进程地址空间的所有数据复制到自己的地址空间,完全继承父进程的所有上下文信息
它们之间可能通信。但是不互相依赖,也无权干涉彼此的地址空间。

轻量级进程减少了内存开销,并为多进程应用程序共享提供了直接支持。但是其上下文切换的开销还是在所难免的。

线程切换的开销相比进程和轻量级进程都要少些。

在单CPU上任何时刻只有一个进程处于运行状态,而其他的进程有的处于挂起状态并等待就绪,有的已经就绪等待CPU时间片,还有的处于其他状态。

进程调试器更加偏爱I/O密集型的进程,因为这些进程在发起I/O操作后通常都会阻塞(除非使用异步I/O),不会占用太多CPU时间。这意味其他进程都可以更好地交错运行。

“上下文”正是表示进程运行到何种程度。

进程拥有自己独立的内存空间,但是每个进程都只能共享CPU寄存器,一个进程被挂起的本质就是将它在CPU寄存器中的数据拿出来暂存在内核态堆栈中,而一个进程恢复工作的
本质就是将它的数据重新装入CPU寄存器。这段装入和移出的数据我们称为“硬件上下文”。它也是进程上下文的一部份。除此之外,进程上下文中还包括了进程运行时需要的
一切状态信息。

使用Nmon工具监视服务器每秒上下文切换次数

如果我们希望服务器支持较大的并发数,那么就要尽量减少上下切换次数,最简单的做法就是减少进程数。尽量使用线程并配合其他I/O模型来设计并发策略。

在请求大量小文件的时候,长连接(Keep-Alive)的有效使用可以减少大量重新建立连接的开销,有效加速性能。

对于长连接的有效使用,关键一点在长连接超时时间的设置。

任何一种技术都有它的应用范围,能够意识到环境的不同而选择合适的技术才是明智之举。



第4章 动态内容缓存

缓存更加注重的是策略,也就是说缓存命中率,如果每次都能在缓存中找到需要的数据,那是最理想的结果,如果每次都不在缓存找不到需要的数据,那缓存将变得
毫无意义。

HTML局部静态化 apache SSI技术。

第6章 浏览器缓存

Last-Modified 和 ETag ,Expires(过期之前不会和服务器交互)

三种请求页面方法
1.Ctrl + F5
这种方式可以叫强制刷新,它使得网页以及其中的所有组件都直接向WEB服务器发送请求,并且不使用缓存协商。这样的目的是获取所有内容的最新版本。你也可以按
住Ctrl键然后单击浏览器刷新按钮得到同时的结果
2. F5
它能够让Last-Modified发挥效果,但对是Expires无效
3.转到,点击超连接
浏览器会对所有没有过期的内容直接使用本地缓存,所以Expires标记只对这种方式有效.

第7章 反向代理缓存

开源软件:Varnish

ESI技术是在HTTP代理服务器上组装内容,包括反向代理。


第九章 WEB组件分离

使用用不同的域名对WEB组件进行分离后,另一个好处随之而来,那就是提高了浏览器在下载WEB组件时的并发数。

浏览器的最大并发数限制有一个前提,那就是对于同一个域名下组件才有效,也就是说,浏览器会为每个域名维护不同的下载队列。

下载在线测试工具:http://site-perf.com

第十章 分布式缓存

memcached

memcached 监控 cacti

第11章 数据库性能优化

80%的性能问题往往都是由20%的错误导致的。

查看mysql运行:show status ,show innodb status

mysql日志查看工具 mysqlreport

大多数情况下,索引扫描当然要比全表扫描获得更好的性能,但这并不是绝对的,如果要查找的记录占据整个数据表的很大比例,那么使用索引扫描反而性能更差。

通过唯一索引来约束记录插入时的唯一性,那么索引本身的计算开销必然会增加,因为当你插入记录的时候会涉及额外的唯一性检查。

explain type const 使用索引 ,type All 全表扫描。 type ref 关联查询索引

一次查询对一个数据表只能使用一个索引

组合索引“最左前缀”基本原则

explain type 为 index 表示这个查询只需要在索引中扫描即可

对于 group by 的查询,数据库一般需要先将记录分组后放置在新的临时表中,然后分别对它们进行函数计算。

explain extra -> using filesort 和 using temporary非常不受欢迎,它们越少越好。

Innodb 类型表中数据的存储顺序是按照主键来排序的

一个包含多个字段的组合索引尺寸可能已超过数据本身

组件索引(key1,key2)索引与(key2,key1) 索引完全不同

查看运行慢SQL工具 mysqldumpslow ,mysqlsla(推荐)

MyISAM 类型的表只缓存索引,不缓存数据

行锁的价值并不在它本身的速度,而是存在特定的应用场景中。

update 密集型的场景下,行锁定并不是救世主。

mysql 中 Innodb除了支持行锁定外,还支持事务。

innodb_flush_method = O_DIRECT 这样设置,Innodb将可以跳过文件系统缓冲区,提高I/O性能。

mysql缓存机制,当一个数据有更新操作(update,insert) 后,那么涉及这个表的所有查询缓存都会失效。

磁盘上创建临时表的开销最大,尽量不要在磁盘上创建。

show processlist 中看到查询状态为 copying to tmp table on disk ,这意味MYSQL将临时表从内存移到磁盘,节省内存。

非主键字段之间不能存在依赖关系

非关系性数据库 MemcacheDB


第12章 WEB负载均衡

HTTP重定向,DNS负载均衡,IP负载均衡(NAT),LVS


第13章 共享文件系统

NFS ,Samba

第15章 分布式文件系统

MogileFS ,Hadoop


第16章 数据库扩展

MySql的主从复制是依据主服务器的二进制日志进行的。

Mysql Proxy工人在应用程序和MYSQL服务器之间,负责所有请求各响应数据转发。

在进行数据库模型设计以及编写应用程序时候,都应该尽量减少使用联合查询

Spock Proxy 实现水平分区调度

第17章 分布式计算

Gearman 用来实现远程函数调用

MemcachedQ是一个单纯的分布式消息队列服务


第18章 性能监控

Nmon是一款工作在服务器本地的实时监控软件

监控宝 www.jiankongbao.com

你可能感兴趣的:(学习收藏)