天天看點

建構高性能WEB站點(二)

第五章   動态腳本加速

   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 緩存擴充 調整緩存分區

繼續閱讀