第五章 动态脚本加速
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 缓存扩展调整缓存分区