高性能--web服務器緩存 (2)

   /**
     *
     *    關於對web服務器緩存(控制期)
     *
     *                                        
                1.web緩存對靜態仍是動態內容的過時檢查
                可能你們對我在上一章中講到,內容與HTTP頭分開存儲的, http頭中  標記就是判斷過時檢查的其實就是創建在http協議上的html


                舉例PHP腳本:  若是要爲一個動態內容指定有效期。
                仍然要在 Http響應頭中追加Expires標記,若是你對這個動態內容不要這個動態內容緩存的話,那麼最簡單的辦法就是讓

                header("Expires: 0");

                這樣web服務器就不會把這個動態內容發到緩存區
                Look下面代碼:

                *
                **/


                $mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE'];


                if (strtotime($mod_time) + 20 > time()) {

                 header("HTTP/1.1  304");

                 exit();
                }

                header("Last-Modified:".gmdate("D, d M Y H:i:s")."GMT");

                header("Cache-Control: max-age=10");

                echo  time();

                /**
                *              關閉服務器磁盤緩存, 那麼上面代碼每到20秒纔到服務器去取數據(這個代                  碼應該不須要我講吧)
                *
                *
                如今我開啓服務器緩存後,這就意味着劉謙器與動態內容之間
                增長了一塊緩存區
                咱們如今不斷刷新,其結果也剛纔是同樣的
                說白了就是 我們的意思就是20後去請求原程序。

                1.Last-Modified ,若是動態內容HTTP協議的頭中包含了,Last-Modified ,那麼web服務器緩存區的最大默認時間就是這個


                2.配置mod_cache:(手冊可見)

                cacheMaxExpire   3600

                這樣 web  服務器即可以在往後與Last-Modified的時間進行比較, 判斷內容是否過時

                若是動態內容中沒有Last-Modified,
                處理方式就是另外一個配置
                CacheIgnoreNoLastMod   若是開啓那麼動態內容將不會被緩存。

                若是沒有last-Modified與Expires,那麼緩存區就不會緩存他。

                這裏有個問題,上一章咱們test的時候就沒這兩個爲啥就緩存了。這是個問題?

                其實啊CacheIgnoreNoLastMod 使用它的默認設置 ,就是關閉,緩存區就會記錄噹噹前時間爲If-Modified ,並其爲最大緩存時間
                原本Apache mod_cache的配置
                CacheIgnoreNoLastMod  這東西就關閉的


                另外就是,若是有些特定的內容不須要緩存,
                好比用戶登陸後成功生成的包含了登陸狀態的Cookie,這東西確定不能緩存澀

                就是要跳過Web緩存區,雖然咱們能夠採用將
                header("Expires: 0"); 讓他不緩存,
                可是還有其餘辦法,因此這東西要看手冊你才能知道的

                Mod_cache提供了:
                CacheIgnoreHeaders  Set-Cookie
                上面的意思就是 凡是要建立瀏覽器Cookie的內容,均可以跳過緩存區,


                其實說真的,有時候,我時候很迷糊的,
                爲啥?
                有些時候程序自身實現的頁面緩存(不少框架都有內置的緩存機制)有些時候其實就是多餘的,

                緣由很簡單程序真正運行到那裏去的時候,其實也走過了,瀏覽器緩存,
                web服務器緩存 好比反向代理緩存......  而後纔會到框架仍是咱們本身寫的緩存系統,可貴你不以爲多餘麼?

                並且直接告訴瀏覽器一個 Expires就能夠解決問題了。

                提及來,若是實現一個基於Http緩存機制的話,這比較錯呢
                若是是基於HTTP的緩存機制,那麼擴展性很好,  即便換一臺服務器,
                也可使用反向代理來快速對接。

                我說這些,其實說白了,這種緩存機制的本質就 以URL爲主鍵的Key->value的結構緩存
                因此咱們必需要保證因此緩存的動態內容都是惟一的Url,
                好比你能夠根據Http請求頭中標記來輸出不一樣的內容。你也能夠把一些標記放到Url參數中,保證URl的惟一性就能夠
                我有時候忽然發現本身想實現的東西太了,可是時間也真是不等人呢,天天都忙的半死,              
                靜態內容與動態內容的緩存管理,已經完畢


                順便再提一下緩存」文件描述符號「 這是隻是討論一下(不要太當真的)

                開發經驗比較多的朋友應該知道若是平臺的的小文件過多,這樣會形成IO開銷比較高,
                說白了就是磁盤尋址的問題,因此web服務器一大部分的開銷都花在這裏的,(閒扯,Lnux上不少小工具很是的不錯,裏面有追蹤工具(strace工具),這工具很厲害,好比我去磁盤目錄中打開一個文件,這個磁盤目錄中文件多的嚇人。
                你用一個追蹤工具能夠看Open()開打文件的系統的調用狀況與時間,你就會明白我說的了,
                若是有這樣狀況若是你的磁盤有比較好目錄結構的話,
                說了吧就不要把不少小文件都放在一個目錄下
                有結構分,比以年月日分 等等........

                若是是這樣的目錄結構打開文件,用工具看一下,效果會好不少的,可是仍是很蛋疼,
                我說的流量大web平臺
                )
                因此不少人會選擇把相似Sesseion這些類的小文件放到Memche中,這種選擇實際上是很對的,可是還想說一個東西
                Apache的文件描述符號,其實來講呢,也沒啥好處,可是我想提一下,

                說到這裏我想先回答一個朋友的問題 再說:,

                問題:關於Apace磁盤緩存引擎與內存緩存引擎
                其實不少朋友都會想,Apache爲啥官方推薦咱們用磁盤緩存,不用他們的內存緩存呢?
                關於多進程下內存共享問題 的開銷大,這個不說,簡單來講我沒看過源碼,也看不了源碼,
                說不了只是Apache社區上的有些開發者這麼說的吧,我沒有發言權利。

                但有個問題是。他們官方居然說我這個磁盤緩存系統不比存儲在內存中的慢,
                並且聽說還比內存緩存快呢,這一下把咱們腦海中內存比磁盤快的觀念給有點打破了
                其實來講磁盤確實確定比內存慢,這點沒啥說的,
                他說了2點
                1.咱們多進程共享緩衝區
                2.內存映射
                內存映射
                我想專門說一下內存映射問題,其實也就是說理論吧

                你們對Linux研究比較深的人,本人除外哈,除了喜歡看一些破書的角色而已。
                應該知道Linux內核提供一種能夠訪問磁盤文件的特殊方式,
                它能夠將內存中地址和咱們要訪問的磁盤文件進行關聯,
                從而把我對這塊內存的訪問轉換爲對磁盤的訪問  這東西就叫內存映射技術

                我你們應該能大致明白啥子是內存映射了吧,繼續:

                使用內存映射能夠提升I/O的性能,他無需使用read()或者write函數等系統函數來訪問文件,而是經過mmap()系統函數來創建內存與磁盤文件的關聯關係,而後像訪問內存同樣自由的訪問文件。

                同志如今明白了不,繼續:

                內存映射分類:
                1.共享型
                2.私有型

                1.共享型,能夠將任何對內存的寫操做同步到磁盤文件中,
                多個進程都共享任意一個進程對映入內存的修改,
                這個裏有個問題就是多進程安全的問題,
                其實能夠簡單理解爲多線程安全問題相似
                一個文件被多個進程映射,那麼有須要有同步機制來控制
                這裏就有了開銷,這樣效率就低了

                2.私有性
                他映射的文件只能是讀類型文件,全部不會把對內存的寫操做
                同步上文件上,並且多個進程不共享修改。


                再來接受一個工具,strace 工具

                在Apache2.0以上都使用了內存的映射的,  

                好比我訪問一個小的靜態頁面,大概200字節  Url:http:/loachost/zb/x/xs/index.html

                apache會選用使用內存映射來讀取,
                用 strace 工具追蹤 Apache子進程的話,你就發現問題的
                本機沒有strace工具沒這工具,
                可是我能夠大致說一下他調用函數流程

                1. Open("/zb/x/xs/index.html",常量|常量) //打開函數
                2.mmap2(xxx); //映射函數  mmap2是對mmap()函數的擴展,原理同樣
                3.writev(xxxxxxxx) ;  //這個函數主要是不把http響應頭的信息與 200字節的正文合併,
                併發送到瀏覽器端,說白了這函數就 就是瀏覽器接受到Http協議的響應頭與內容
                4.munmap();//撤銷映射,

                子程序大致就作這幾步,你能夠用工具追蹤一下,一追便知


                順便再提一個東西,直接I/O這東西,其實本質上給內存映射沒多大差異的

                順便再說一個在I/O操做中,就以java來,可是點到即止哈,
                I/O操做是是否是有一個緩衝區的的概念呢 寫buffer  讀buffer  StringBuffer  xxxbuffer 對象呢?。
                我保證你去看一下jdk手冊保證mmap都有

                其實mysql 的有個Innodb_flush_method ,能夠配置innodb支持I/o直接訪問的,

                跑題了,繼續說 文件描述符號


                因爲有大量的小文件,即調用Open系統函數,全部咱們能夠直接
                考慮將打開後的文件描述緩存到 web服務器內存中,
                這個只能存在本機內存中,由於他描述的是本機上的文件資源,

                Apache提供一個 擴展   mod_file_cache

                我直接貼手冊上的,

                Apache模塊 mod_file_cache
                說明 提供文件描述符緩存支持,從而提升Apache性能
                狀態 實驗(X)
                模塊名 file_cache_module
                源文件 mod_file_cache.c

                他應該是處於試驗階段的,可是也能夠用

                配置:  仍是用上面的有Url吧

                CacheFile   /zb/x/xs/index.htm


                可是緩存文件描述符方案只適合與靜態文件
                若是有對這些文件的請求,Apache將經過文件描述直接發送出去
                若是是不少的話,只是寫正則模糊匹配就好了手冊有

                還要重點指出的是:,
                只要配置了,Apache在啓動時就會 打開這些文件
                並持續到 Apache關閉爲止,有些朋友確定想到了,若是開啓Apache就意味着要打開不少文件的話,那麼內存這塊確定會帶來不少內存開銷,
                還有就是文件更新的話,必需要重啓Apache纔有效哈,
                緩存文件描述符對於較大的文件來不適用,
                若是是大文件的話,消耗只會是在傳送中,而不是在Open,
                聽起來挺沒用的噶
                我相信有些站點是能夠用的,只是我還沒用過吧,畢竟我們瞭解他的原理,
                說不定那天還真能用呢,其實這個緩存文件描述符思想挺好的
                我建議能夠ab工具測試一下配置先後差異與strace工具配合
                完結了.......................................
                *
                */





java

相關文章
相關標籤/搜索