日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Squid合并回源技术

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Squid合并回源技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.chinaunix.net/uid-8474831-id-3830240.html


1. 合并回源的概念

對于CDN的cache服務器而言,減少回源,提高命中率是一個重要的功能,尤其是在處理大文件的時候。這次我們就講一講squid是怎樣讓盡可能多的對于相同url的請求共用同一個回源請求的。

當然,如果一個object已經完整地存在了squid的磁盤上,在它過期之前是不會回源的。我們要討論的是正在從原站下載過程中的object,當另外一個客戶端來下載它的時候。其他cache軟件可能會忽略當前正在下載的object,而另起一個回源請求去下載。這樣的話,在第一個客戶端完整地下完這個object的時候,cache會回源多次。而squid則可以將這些請求合并起來,用一個回源請求服務所有的客戶端。

2. Squid的store_client層

Squid合并回源請求,主要靠的就是store_client層。

Store_client層的工作原理是:當有多個request請求文件的不同部分時,store_client層會對他們采取不同的處理。

圖1表示一個1G的object被多個請求同時訪問的情形。

request1是第一個訪問這個object的請求,由他發起了回源,現在回源已經下載了200M的內容;

request2是一個從頭開始的請求,它開始得比較晚,只請求了100M

request3是一個range請求,它請求的是還沒有從原站下到的部分;

?

圖 ?1

?

注意,雖然是request1發起了回源,但回源請求并不是request1本身,而是由fwdStart函數發起的一個單獨的回源請求。即使request1斷掉了,回源也是可以繼續的,直到下載完整個object為止。

這3個請求都要通過store_client層的storeClientCopy函數從store拿數據。

2.1 數據從內存來

request1的copy_offset是199M,而從150M到200M的數據全都在內存里,因此它進入的分支在storeClientCopy3函數里,它是:

  • if (sc->copy_offset >= mem->inmem_lo&& sc->copy_offset < mem->inmem_hi)
  • {
  • ????/* What the client wants is in memory */
  • ????debug (20, 3) ("storeClientCopy3: Copying from memory\n");
  • ????sz = stmemCopy (&mem->data_hdr, sc->copy_offset, sc->copy_buf, sc->copy_size);
  • ????if (EBIT_TEST (e->flags, RELEASE_REQUEST))
  • ????????storeSwapOutMaintainMemObject (e);
  • ????storeClientCallback (sc, sz);
  • ????return;
  • }



  • 直接就用stmemCopy將內存中的數據copysc->copy_buf中,然后storeClientCallback回調客戶端的函數(其實就是clientSendMoreData)??梢钥吹?#xff0c;根本不需要讀磁盤。


    2.2????? 數據從磁盤來

    request2的copy_offset是100M,比inmem_lo要低,它進入的分支很簡單,就是storeClientCopy3函數的最后一行:

  • storeClientFileRead (sc);


  • storeClientFileRead顧名思義,就是去讀文件了。


    storeClientFileRead會調用storeRead,進入多線程的aufs異步io,拿到文件內容之后還是會調用storeClientCallback回調。

    2.3????? 數據還在原站

    request3很顯然,數據在磁盤和內存都沒有。所以它所能做的就是等待了。它的分支是

    點擊(此處)折疊或打開

  • if (e->store_status == STORE_PENDING&& sc->seen_offset >= mem->inmem_hi)
  • {
  • ????/* client has already seen this, wait for more */
  • ????debug (20, 3) ("storeClientCopy3: Waiting for more\n");

  • ????/* If the read is backed off and all clients have seen all the data in
  • ????* memory, re-poll the fd */
  • ????if ((EBIT_TEST (e->flags, ENTRY_DEFER_READ)) &&????(storeLowestMemReaderOffset (e) >= mem->inmem_hi))
  • ????{
  • ????????debug (20,3)("storeClientCopy3: %s - clearing ENTRY_DEFER_READ\n", e->mem_obj->url);
  • ????????/* Clear the flag and re-poll the fd */
  • ????????storeResumeRead (e);
  • ????}
  • ????return;
  • }

  • 既沒有讀磁盤,也沒有讀內存,就return掉了。那么什么時候這個客戶端會繼續呢?就是當回源鏈接每從原站讀到一塊數據,會調用storeAppend,進而調用InvokeHandler,由于request2的store_client是當前storeEntry的client之一,invokeHandler會對request2的store_client重新調用storeClientCopy2和storeClientCopy3,如果到了那個時候它所需要的數據在內存或硬盤了,客戶端就會繼續收到數據。

    ?

    3.??? 折疊回源機制collapsed_forwarding

    剛才說的是store_client層,它的作用是,管理已經在訪問同一個object的所有客戶端,讓他們取到各自需要的數據。

    那么,怎樣讓所有的客戶端訪問到同一個object呢?

    squid會為每一個object創建一個StoreEntry結構,并放到store_hash這個哈希表中,供后來的request查找。當request1從原站下載到了數據時,它的StoreEntry肯定是已經創建好了。這個階段要讓其他請求找到這個object是很容易的。

    但問題就是request1的客戶端請求已經發到了squid,而原站數據還沒有下載到的這個期間,如果其他請求來了怎么辦呢?其實squid為這個問題引入了一個配置項,叫做collapsed_forwarding,可以on或者off。這個配置項的意思就是,所有請求共用一個回源請求。

    3.1 collapsed_forwarding on

    當配制成on的時候,只要request1的客戶端請求發到了,這時候url也知道了,就立即創建它的StoreEntry,并放到hash表中。即使回源的數據還沒拿到,其他請求也能找到它的StoreEntry。

    但是,這時候就有一個問題了,萬一request1請求的是動態內容怎么辦?難道讓其他請求也拿到跟request1一樣的內容么?

    當然不會!squid在clientCacheHit中做了防范。clientCacheHit是當一個回調函數,在請求hit了,并拿到reply頭的時候由storeClientCallback回調。

    假如request2就是一個這樣的請求,它發生在在request1拿到原站的數據之前,并找到了request1創建的StoreEntry,而且“以為”自己hit了。而回源的reply中有Cache-Control:no-cache,那么當request2在進入clientCacheHit時,它找到的StoreEntry中一定會有RELEASE_REQUEST這個標識。這個標識是httpCachableReply函數發現no-cache之后設置的。當發現這個標識的時候,就會從clientCacheHit轉入clientProcessMiss,重新回源,不會跟request1取到相同的數據。代碼如下

  • if (r->flags.collapsed && EBIT_TEST (e->flags, RELEASE_REQUEST))
  • {
  • ????/* collapsed_forwarding, but the joined request is not good
  • ???? * to be cached..
  • ???? */
  • ????clientProcessMiss (http);
  • ????return;
  • }

  • ?

    3.2????? collapsed_forwarding off

    當配制成off的時候,與on相反,當request1發過來的時候,不立刻將 StoreEntry放到hash表中,只有當回源請求拿到了reply頭,確認是可緩存的內容后,才將StoreEntry放到hash表中。

    雖然回源拿到響應頭的時間通常很短,但終究有可能發生“誤會”,request1和request2都回源了。那么這種情況下會不會兩個回源請求產生沖突,比如寫同一個cache文件之類的問題呢?

    其實也不會。squid對這種情況也做了防范。

    在發現一個object可緩存時,會調用httpMakePublic,進而調用StoreSetPublicKey。StoreSetPublicKey主要是負責將一個StoreEntry放入hash表。這時候它會先檢查hash表中是否已經有了key相同的object,如果有,要先刪除舊的再插入新的。

    刪除舊的object之后,request1和request2的回源都不會停止,以保證客戶端下到完整的數據。

    那么,它們會不會寫到相同的文件里呢?

    還是不會。因為squid為新的object分配文件名不是直接將key轉換為文件名,而是用一個filebitmap來分配一個文件號,用這個文件號來生成文件名。分配過的文件號是不會被再次分配出去的。

    還有最后一個問題,就算文件名不同,request1回源取到的數據還會不會被寫到磁盤上呢?

    看到這里,你會知道squid是很聰明的,所以答案當然還是不會了。因為舊的entry一旦被打上RELEASE_REQUEST標,同時會清掉ENTRY_CACHABLE標,它的swapout就不會再進行了。這是在storeSwapOutMaintainMemObject里保證的。

  • swapout_able = storeSwapOutAble (e);
  • if (!swapout_able)
  • {
  • ????/* Stop writing to disk */
  • ????storeReleaseRequest (e);
  • ????if (e->mem_obj->swapout.sio != NULL)
  • ????????storeSwapOutFileClose (e);
  • }

  • 其中storeSwapOutAble的定義如下:

  • static int storeSwapOutAble (const StoreEntry * e)
  • {
  • ????if (e->mem_obj->inmem_hi > Config.Store.maxObjectSize)
  • ????????return 0;
  • ????if (!EBIT_TEST (e->flags, ENTRY_CACHABLE))
  • ????????return 0;
  • ????if (e->mem_obj->swapout.sio != NULL)
  • ????????return 1;
  • ????if (e->mem_obj->swapout.queue_offset)
  • ????????if (e->mem_obj->swapout.queue_offset == e->mem_obj->inmem_hi)
  • ???? ????return 1;
  • ????if (e->mem_obj->inmem_lo > 0)
  • ????????return 0;
  • ????return 1;
  • }


  • 4.
    思考題?

    最后,請大家想一想,什么樣的業務模式適合collapsed_forwardingon,什么樣的適合off呢?


    總結

    以上是生活随笔為你收集整理的Squid合并回源技术的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天天草av| 日本一区二区三区中文字幕 | 欧洲日韩一区二区三区 | 欧美成人三级在线观看 | 在线色导航| 亚洲白浆 | 九九99精品视频 | 中文字字幕一区二区三区四区五区 | 精品成人无码一区二区三区 | 日韩免费在线视频 | 免费看的黄网站 | 邻居少妇张开腿让我爽了在线观看 | 老司机伊人 | 欧美黑人粗大 | 91午夜精品亚洲一区二区三区 | 日韩精品一卡 | 日韩免费在线播放 | 婷婷精品一区二区三区 | 爱情岛亚洲首页论坛 | 四虎影视成人 | 在线观看国产一区二区 | 欧美入口| 91原创国产 | 波多野结衣一级 | 伊人久久大香线蕉综合75 | 亚洲AV无码国产精品国产剧情 | 麻豆国产精品一区 | 日本精品三级 | 啪网站| 亚洲成人久久久 | 久久精品www人人爽人人 | 成品人视频ww入口 | 一区二区三区在线观看免费 | bangbros性欧美18 | 国产又色又爽又黄的 | 国产jizz18女人高潮 | 日本在线观看一区二区三区 | 热久久中文 | 国产夫妻性爱视频 | 爽爽av | 深夜小视频在线观看 | 亚洲女人视频 | 国产一区二区三区精品愉拍 | 国产春色| 加勒比色综合 | 天天操婷婷 | 成年人免费黄色 | 操女人的逼逼 | 亚洲天堂久久久 | 日本极品少妇 | 免费国产黄 | 久久久无码精品亚洲国产 | 拔擦8x成人一区二区三区 | 毛毛毛片 | 久久精品黄aa片一区二区三区 | 日本系列第一页 | 国产精品骚 | 二十四小时在线更新观看 | 色婷婷久久久亚洲一区二区三区 | 天天草天天爽 | 99色网 | 夜夜嗨av一区二区三区免费区 | 欧美日韩综合视频 | 鬼眼 电影 | 国产免费av片在线观看 | 亚洲伊人成人网 | 亚洲高清在线观看视频 | 亚洲第一黄色网址 | 另类欧美尿交 | 日本a级片网站 | 国产免费又爽又色又粗视频 | 激情欧美综合 | 亚洲专区中文字幕 | 在线成人一区二区 | 中文字幕精品一二三四五六七八 | 影音先锋二区 | 免费色站| 成人福利视频网 | 日韩精品一区二区三区久久 | 最新成人 | 91亚洲精品乱码久久久久久蜜桃 | 女警白嫩翘臀呻吟迎合 | av毛片观看 | 吸咬奶头狂揉60分钟视频 | www av| 91丨porny丨露出| 中文av一区| 91精品视频免费观看 | 国产精品久久久久免费 | 欧美性xxxx图片 | 亚洲色图在线播放 | 日本久久视频 | 中文字幕码精品视频网站 | 成人综合区 | 亚洲区国产区 | av在线毛片 | 国产97色在线 | 日韩 | 成人免费一级片 | 九色视频偷拍少妇的秘密 |