第五章 動态腳本加速
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 緩存擴充 調整緩存分區