第五章 动态脚本加速
5.1 opcode缓存(缓存脚本语言可以直接运行的中间代码=)操作码)避免中间代码生成开销 PHP中的opcode缓冲区扩展 APC eAccelertor XCache
1)APC php.ini中打开opcode cahe开关 apc.cache_by_default = on 同样可以修改apcfilters 让APC只对特定范围的动态程序进行opcode缓存 可以使用Cacti等监控系统来定时获取opcode的缓存状态(默认情况下,缓存opcode的程序在每次请求是都会检查程序是否有变化,有的话会重新编译 =)检查可以关闭,但是关闭后程序发生变化 只能重新web服务器使其生效)
2)减少cpu和内存占用
5.2解释器扩展模块 需要充分考虑扩展模块可能对性能代理的副作用
5.3脚本分析和跟踪 XDebug
第六章 浏览器缓存
6.1利用浏览器(HTTP协议缓存部分)
6.2缓存协商 浏览器只缓存Get类型请求,对浏览器动态内容与静态内容缓存无任何区别
1)Last-Modified =》为HTTP响应头消息增加最后修改时间标示=》浏览器询问If-Modified-Since =》服务器响应 Not modified
2)使用ETag进行缓存协商 HTTP响应头增加ETag-》浏览器询问If-None_match=>服务区回答304状态码/最新的内容
基于时间缓存的缺点:缺点:内容没有变化,但是修改时间变化的文件也会被全部重新获取,导致每次连接如果连接到不同的服务器(分布式服务器很难保证文件修改时间完全相同),都全部重新获取,使用ETag可以避免此问题
3)让动态内容与浏览器交流 动态判断是否返回新的内容
4)SSI和Last-Modified Apache必须手动开启SSI的Last-Modified支持,会导致SSI文档吞吐率降低1/3;Lighttpd会自动将子页面时间设置为整个页面的Last-Modified时间
6.3彻底消灭请求
HTTP标记 Expires 直接告诉浏览器该内容在何时过期,在该内容过期前不需要询问服务器,直接使用本地缓存即可
三中HTTP请求 a:Ctrl+f5 强制刷新,不考虑浏览器缓存机制 b:F5 允许浏览器进行缓存协商,但是不允许浏览器使用本地缓存 c:超链接或者转到跳到此页:允许浏览器以最少的请求获得网页数据
适应本地过期时间(用户本地时间与服务器时间不一致导致过期检查时间失效)使用Cache-Control 用max-age指定缓存过期时间(单位:秒)
第七章 Web服务器缓存
7.1 URL映射 使用URL Rewrite(地址重写技术) 改写映射的文件、目录、甚至映射到网络
7.2缓存响应内容 很多时候,一个URL在一段较长的时间内对应一个唯一的响应内容,可以将最终内容缓存后直接返回(Web服务器一般都支持 Apache mod_cache)
Apache 推荐使用mod_disk_cache(mod_mem_cache停止使用)=》需要修改编译选项和增加配置
编译时 configure 追加 --enable-cache=share –enable-disk-cached-shared –enable-so
增加配置 LoadModule cache_module modules/mod_cache.so
LoadMoudule disk_cache_module modules/mod_disk_cache.so
CacheRoot /date/apache_cache
CacheEnable disk /
CacheDirLevels 5
CacheDirLenght 3
CacheRoot 为缓存内容存储目录 CacheEnable指定缓存引擎(磁盘),如果只缓存某个目录,可以使用CacheEnable disk /images;CacheDirLevels, CacheDirLenght 为缓存的目录分级结构。
Lighttpd mode_trigger_b4_dl模块
缓存静态内容:对于SSL的shtml页面,缓存性能提高很大,html有一定程度的提升
缓存动态内容:速度明显快于开启了APC内存缓存和APC opcode cache缓存(引入新问题 缓存过期)。
有效期控制:使用Expires标记(过期时间),Last-Modified标记(过期时间与最后修改时间对比),mod_cache配置CacheIgnoreNoLastMod(开启不缓存,关闭 使用当前时间作为Last-Modified 并且使用默认最大缓存时间)mode_cache 配置CacheignoreHeaders Set-Cookie(设置跳过缓冲区的动态内容)
动态程序自身一般不需要实现缓存机制(Web服务器缓存,浏览器缓存、反向代理缓存等可以替代)
7.3 缓存文件描述符 对于大量小文件,web服务器可能花费大量时间在打开文件上,可以缓存文件描述符来减少响应时间(大文件时间主要花费在传输上 没有缓存必要)
Apache mod_file_cahce 扩展
CacheFile /data/www/htdocs/test.html Apache在启动时打开文件,持续到关闭位置
第八章 反响代理缓存
8.1反向代理:与代理服务器工作原理类似,web服务器在反向代理服务器后
8.2在反向代理服务器上创建缓存
1)nginx反向代理服务器: 打开mod_proxy模块 设置proxy_pass指令 使用方式:将web服务器和动态内容服务器分类,web服务器处理静态内容,并作为反向代理,将动态内容的请求转发到后端的应用服务器
Nginx中的配置 locatioc ~ \.php${proxy_pass localhost:80;}
2) 引入缓存 推荐使用:Varnish (Nginx缓存机制不完善,且反向代理仅为一个扩展模块),Squid 过于庞大 Varnish的使用参考手册 =》吞吐率有很大提高,且与后端服务器处理能力关系不大
3)修改缓存规则 VCL配置语言
4)缓存清除 varnishadm –T 清除某个url的缓存 也可以使用HTTP方式清除PURGE\
5) 监控缓存命中率 varnishstat命令行工具 Varnsih Web监控页面,Cacti监控平台
6)缓存命中率和后端吞吐率的理想计算模型
缓存命中率 = 1-(活跃内容数/(实际吞吐率*平均缓存有效期))*100%
后端吞吐率 = 活跃内容数/平均缓存有效期
4) 针对网页的各部分内容更新频率各不相同ESI 一种标准,类似于SSI(Web服务器端组装内容),在HTTP服务器上组装内容,包括反向代理
也可以使用 AJAX 将需要频繁更新的局部内容采用异步请求的方式(需要注意AJAX的跨域问题,局部内容与父页面保持相同的*域名)
5) 和动态缓存一起工作
多级缓存 发现问题之前降低影响范围
暴露后端 反向代理主要用于跨地域加速时 反向代理服务器和后端服务器可以基于DNS策略的负责均衡分别服务不同地域的用户
首次加载 最先访问的用户无法命中代理服务器缓存
多台反向代理服务器 多台方向代理服务器指向同一台后端服务器,造成多次首次加载
8.4 小心穿越代理 代理服务器只转发HTTP请求到后端服务器,后端服务器无网络数据(IP地址 端口号等) 后端服务器可以用这些数据进行性能优化时使用
8.5 流量分配
第九章 Web组件分离
9.1 Web组件的差异:文件大小,文件数量,内容更新频率,预计并发用户数,是否需要脚本解释器,是否涉及大量CPU计算,是否访问数据库,访问数据库主要操作时读还是写,是否包含远程调用(RPC)
优化方案:使用epoll模型,使用sendfile()系统调用,使用异步I/O 支持HTTP持久连接,使用opcode缓存 使用动态内容缓存(缓存有效期),使用web服务器缓存(有效期),使用浏览器缓存(有效期),使用反向代理缓存(有效期),使用负载均衡策略
9.2 使用不同域名,使用二级域名作为组件服务器地址
带来问题:将站点的cookies作用域设置为*域名是,每次浏览器访问会在HTTP请求头信息中添加本地cookies
解决办法:缩小 cokkies作用域
使用新的*域名
9.3 浏览器并发数文本组件分离是浏览器可以多线程下载web组件
9.4 各种web组件的处理策略
动态内容:1)开启opcode缓存 2)更快的cpu 3)足够大的内存4)多进程5)与数据库保持高速连接6)可靠的数据中心
静态网页:1)支持epoll 2)非阻塞I/O 3)异步I/O 4)使用sendfile系统调用 5)单进程 6)使用高速磁盘 7)使用RAID分区 8)购买足够的带宽
图片:HTTP持久连接 设置Expires过期时间
样式表:CSS样式表更新并不频繁 Google的日历服务器CSS样式表有效期设置为1年
脚本:尽量缓存在浏览器本地(漫长的过期时间)
视频:用户请求通常指向不同文件,磁盘位置读操作过于随机(磁盘负载能力), 默认开启sendfile
下载服务器:无下载速度限制 自行规划
第十章 分布式缓存
页面缓存(整体缓存)的缺点
1. 一个网页中不同区域的内容,自身更新频率和呈现及时度要求各不相同,如果为迁就频繁更新的区域,使整个页面频繁重建缓存,影响整体吞吐率
2. 使用局部动态缓存,如果局部区域过多,会使页面结果过于复杂,整合各个局部页面开销巨大
3. 部分计算无法作为页面缓存(用户登录状态相关、用户相关)
4. 所有的页面缓存只能改善写的速度 不能改善读的速度
10.1 数据库的前端缓冲区
10.2 使用memcached
1)memcached 使用key_value方式存储数据 数据查询时间复杂度为O(1)
2)数据项过期时间(LRU算法)
3)网络并发模型 memcached可以运行在独立的服务器上,通过libevent实现网络并发模型
4)对象序列化
10.3 读操作缓存
1)重复的身份验证
10.4写缓存操作
10.5监控状态 空间使用率、缓存命中率、I/O流量
10.6 缓存扩展 调整缓存分区